Как ВЫБРАТЬ строку без ссылки из таблицы и заблокировать ее? - PullRequest
1 голос
/ 11 сентября 2010

У меня есть таблица шале, на которую ссылается шале в учетной записи ...

CHALET
------
int ChaletId PK
int Berth

ACCOUNT
-------
int AccountId PK
int ChaletId FK

Шале начинаются без ссылки. Когда пользователь покупает шале, код должен найти шале без ссылок и назначить его вновь созданной учетной записи. Я думаю, что возвращенное шале должно иметь UPDLOCK до тех пор, пока учетная запись, которая будет ссылаться на него, не будет зафиксирована, чтобы не дать одновременному покупателю назначить одно и то же шале.

Как мне написать SELECT, который выбирает шале? Я думал что-то вроде этого ..

SELECT * FROM CHALET WITH (UPDLOCK) c
LEFT JOIN ACCOUNT a
ON c.ChaletId = a.ChaletID
WHERE a.ChaletID is null
AND Berth = 4

Я думаю, что проблема в том, что если этот запрос выполняется одновременно, тогда один запрос может заблокировать половину одной таблицы, а другой может заблокировать другую половину, и гарантируется мертвая блокировка. Это можно обойти? Например, можно ли заблокировать выбранные строки шале в тех же порядках?

Ура, Ян.

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Будет ли (UPDLOCK, ROWLOCK, READPAST) делать то, что вам нужно ?

1 голос
/ 13 сентября 2010

Я думаю, что вы пытаетесь использовать блокировку параллелизма SQL, когда вам действительно нужно приложение для обработки предварительных резервирований.

  • Создать флаговый столбец или отдельную таблицу бронирований, находящихся в полете.
  • Сделайте все остальные ваши запросы исключающими элементы, которые находятся в процессе резервирования.
  • В случае отката вам необходимо отменить эту оговорку.
0 голосов
/ 11 сентября 2010

1001 * попробовать *

SELECT * FROM CHALET WITH (UPDLOCK, HOLDLOCK) c
LEFT JOIN ACCOUNT a
ON c.ChaletId = a.ChaletID
WHERE a.ChaletID is null
AND Berth = 4

Но почему вы не используете свойство идентичности для такого рода вещей вместо того, чтобы пытаться свернуть свое собственное?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...