У меня есть эта таблица:
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).
В большинстве случаев блокировка до завершения транзакции для удаления обеих строк блокируется, но в некоторых случаях она может перейти к следующей строке, чтобы вставить вторую строку. Если это произойдет, то у меня нет данных о согласованности.
Но я не знаю, так ли это, потому что я делаю некоторые ошибки в тесте или в тех же редких случаях первый запрос не блокируется, как я ожидаю.
Неужели во всех случаях первая вставка должна быть заблокирована, если выполнено первое удаление?
Таблица пуста. Таким образом, кажется, что строка блокируется, когда я пытаюсь удалить, и она не позволяет вставить строку, но я не знаю, могут ли действительно быть некоторые редкие ситуации, в которых строка не блокируется.
Спасибо.