2014-01-08 2 views
2

Это может быть очень глупый вопрос, но, как говорится, «единственный тупой вопрос - тот, который вы не спрашиваете» ...Можно ли заблокировать запись и разрешить другим пользователям читать ее?

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

Все это делается на переднем конце C#, так как это будет в нашей Интранете.

+0

Что вы подразумеваете под замком для редактирования? это простая блокировка для продолжительности обновления (несколько миллисекунд) или вы хотите заблокировать время, когда пользователь редактирует текстовые поля этого объекта (может никогда не закончиться)? – Rafal

+0

Просто до тех пор, пока оно не будет совершено. Я думаю, что marc_s дал мне хорошее объяснение, поэтому я собираюсь продвинуться с этой информацией. –

+0

Это утверждение: «Я хочу, чтобы первый человек, который мог редактировать запись», звучит так, будто вы говорите об аутентификации пользователей, а не о блокировке строк в БД. –

ответ

3

Не выполняйте свою собственную блокировку - пусть SQL Server обрабатывает ее самостоятельно.

Пока вы только SELECT, вы поставите, что называется общий замок на подряд - другие пользователи, которые хотят также прочитать эту строку можно сделать так.

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

+0

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

+0

@ebyrob: необязательно - если вы не делаете явных транзакций, то каждый оператор T-SQL запускается в своей собственной неявной транзакции. –

+0

Я не помню все капризы транзакций T-SQL, но я * помню, что автообложение было, как правило, страшным и непредсказуемым местом, когда я в последний раз работал над ним. (неявные транзакции по-прежнему совершаются более или менее вручную, автоматическая фиксация совсем другая и более беспорядочная) –

2

Чтобы расширить ответ Marc_s, тем читатель можно также использовать

set transaction isolation Level read uncommitted 

заявления as described here заставить чтения игнорировать любые замки (с исключением любого Sch-M, модификация схемы, блокировки), которые могут существовать. Это также полезная настройка для отчетов, которые не требуют абсолютной воспроизводимости, поскольку она может значительно повысить производительность этих отчетов. Для

+0

(a) помните, что вы * можете * читать данные, которые в конце не будут переданы базе данных!А также: (b) это не помогает для ** всех ** блокировок - если у вас есть блокировка «Sch-M» (модификация схемы), тогда «READ UNCOMMITTED» все равно будет остановлен и фактически не будет читать данные ... –

+0

@marc_s: Обычно я предполагаю, что замки * Sch-M * очень редки в производственной базе данных. В бухгалтерском пакете на основе книги ситуация (а) также необычна, если не совсем редка. –

+1

Правда - я просто не мог устоять, так как вы написали * игнорировать ** любые ** блокировки, которые могут существовать * - это слишком оптимистично - он будет игнорировать ** большинство ** блокировок .... –

0

В дополнение к существующим ответам: Вы можете включить изоляцию моментальных снимков. Это дает вашей транзакции моментальный снимок базы данных для чтения. Эта транзакция не будет блокировать данные вообще. Он не будет блокироваться.

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