Можно ли заблокировать запись и разрешить другим пользователям читать ее?
Это может быть очень глупый вопрос, но, как говорится, "единственный тупой вопрос - это тот, который вы не задаете"...
У меня есть база данных SQL Server 2008, и я хочу заблокировать запись для редактирования. Однако другой пользователь может захотеть увидеть информацию в этой записи одновременно. Итак, я хочу, чтобы первый человек смог заблокировать запись в том смысле, что он единственный, кто может ее редактировать. Тем не менее, я все еще хочу, чтобы другие пользователи видели данные, если они хотят.
Все это делается из внешнего интерфейса C#, так как он будет в нашей внутренней сети.
3 ответа
Не делайте свою собственную блокировку - пусть SQL Server обрабатывает ее самостоятельно.
Пока только ты SELECT
вы положите в строку то, что называется общей блокировкой - другие пользователи, которые также хотят прочитать эту строку, могут это сделать.
Только когда ваш код отправляется на обновление строки, он устанавливает эксклюзивную блокировку для строки, чтобы иметь возможность его обновить. В течение этого периода никакие другие пользователи не смогут прочитать ту единственную строку, которую вы обновляете, - пока вы не совершите транзакцию.
Чтобы расширить ответ Marc_s, читатель также может использовать
set transaction isolation Level read uncommitted
оператор, как описано здесь, для принудительного чтения, чтобы игнорировать любые блокировки (с заметным исключением любых Sch-M, модификация схемы, блокировки), которые могут существовать. Это также полезный параметр для отчетов, которые не требуют абсолютной воспроизводимости, поскольку он может значительно повысить производительность этих отчетов.
В дополнение к существующим ответам: Вы можете включить изоляцию снимка. Это дает вашей транзакции моментальный снимок базы данных для чтения. Эта транзакция не будет блокировать данные вообще. Это не будет блокировать.