我在 SQL 服务器上有一个表格, 并同时用一个存储程序进行 CROUD 同步, 在不同会话中同时运行 :
|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|
该程序工作如下:
- Generate a GUID.
- Insert some records into the shared table described above, marking them with the GUID from step 1.
- Perform a few updates on all records from step 2.
- Select the records from step 3 as SP output.
在存储的程序中,每个选择/插入/更新/更新/删除语句都有一个 WHERE JobGUID = @jobGUID
条款,因此该程序只能使用在步骤2上插入的记录,然而,有时当同一存储程序在不同连接中平行运行时,在共享的表格上出现僵局。下面是 SQL 服务器配置器的僵局图示:
"https://i.sstatic.net/wA5Od.png" alt="SQL服务器配置器死亡图"/ >
锁定升级不会发生。 我尝试在所有 DML 语句中添加 < code> (UPDLOCK, ROWLOCK) 锁定提示, 并(或) 在交易中用不同的孤立级别将程序正文包起来, 但它没有帮助 。 在共享的表格上仍然使用相同的 RID 锁定 。
在我发现共桌没有主钥匙/身份栏之后,我发现共桌没有主要的钥匙/身份栏。 一旦我加进这一栏,僵局似乎就消失了:
alter table <SharedTable> add ID int not null identity(1, 1) primary key clustered
当我去除主键柱时,僵局又回到了过去。 当我把它又加回去时,我不能再重现僵局了。
所以,问题是,一个主要的关键身份识别栏 真的能够解决僵局吗? 还是只是巧合?
最新消息: as < a href="https://stackoverflow.com/uss/562459//catcall" 标题="Catcall"\\Catcall 表示,我尝试在现有栏目上创建自然分组主键(不添加身份栏),但仍然陷入僵局(当然,这次是钥匙锁,而不是RID锁)。