【发布时间】:2019-10-12 06:30:09
【问题描述】:
我有这张桌子:
TableAB
{
IDA;
IDB;
}
而且我想确保始终拥有 (ID1, ID2) 和 (ID2, ID1) 对。所以我试图将它用于脚本:
插入:
begin tran
insert into tablaAB (IDTablaA, IDTablaB) VALUES(1,2);
insert into tablaAB (IDTablaA, IDTablaB) VALUES(2,1);
commit
删除:
begin tran
delete tablaAB where IDTablaA = 1 and IDTablaB = 2
delete tablaAB where IDTablaA = 2 and IDTablaB = 1;
commit
我正在使用 Microsoft Management Studio 的两个实例来运行这两个查询,并且在大多数情况下,它可以正常工作,我得到两行或其中任何一行。但有时,我只得到其中一个。
步骤如下:
- 运行查询以删除 (1,2)。
- 运行查询以添加 (1,2)。
在大多数情况下,它是阻塞的,直到删除两行的事务完成,但在某些情况下,它可以传递到下一行,插入第二行。如果发生这种情况,那么我没有一致性数据。
但我不知道是因为我在测试中犯了一些错误,还是在同样罕见的情况下,第一个查询没有像我预期的那样被阻止。
如果第一次删除完成,真的在所有情况下第一次插入都应该被阻塞吗?
桌子是空的。因此,当我尝试删除时,似乎该行被阻止并且不允许插入该行,但我不知道是否真的会出现一些罕见的行未被阻止的情况。
谢谢。
【问题讨论】: