2009-03-24 4 views
2

У меня есть ситуация, когда перед выполнением определенной задачи я должен проверить, установлен ли конкретный флаг в БД, и если он не установлен, выполняется остальная обработка и тот же флаг установлен. Теперь, в случае одновременного доступа из двух разных транзакций, если первая транзакция проверяет флаг и не устанавливается, он продолжается дальше. В то же время я хочу ограничить вторую транзакцию проверкой флага, то есть я хочу ограничить эту транзакцию выполнением запроса SELECT, и она может выполнить ее, как только первая транзакция завершит свою обработку и установит флаг.Ограничение оператора SELECT в SQL Server 2005

Я хотел реализовать его на уровне БД с помощью замков/подсказок. Но никакие подсказки не ограничивают запросы SELECT, и я не могу пойти на ограничения уровня изоляции.

ответ

2

Вы можете создать Application Lock защитить свой флаг, поэтому вторая транзакция не будет выполнять SELECT, или получить доступ к флагу, если он не может получить блокировку приложений

1

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

Вот некоторые common locks, которые также могут помочь вам, если вы хотите более детально.

Редактировать: XLOCK также может быть полезен. И также может помочь упаковка SQL в транзакцию.

0

Можно попробовать хранимую процедуру, которая делает обе задачи, или как точка входа для двух различных хранимых процедур, которая выполняет разные задачи (что-то вроде прокси).

Хранимые процедуры - это мониторы на SQL Server, поэтому артефакты для управления параллелизмом (что вы хотите сделать).

0

Вам просто нужно просто начать транзакцию в своем SP/коде, а затем обновить флаг. Это заблокирует любого другого пользователя от его чтения (если только они не читают незафиксированные).

Если они читают незафиксированные данные, установите исключительную блокировку транзакции обновления.

Смежные вопросы