Использование IsolationLevel.Snapshot, но БД все еще блокируется - PullRequest
7 голосов
/ 25 июня 2009

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

Мы используем уровень изоляции моментальных снимков, который, насколько мне известно, использует оптимистичный параллелизм: вместо блокировки он надеется на лучшее и выдает исключение, если вы пытаетесь зафиксировать транзакцию, если затронутые строки были изменены другая сторона во время сделки.

Чтобы использовать уровень изоляции снимков, мы используем:

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;

и в C #:

Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);

Обратите внимание, что снимок IsolationLevel отличается от снимка ReadCommitted, который мы также пробовали, но в настоящее время не используем.

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

Однако на практике, когда один человек останавливает транзакцию во время отладки, все другие пользователи БД, пытающиеся получить доступ к тем же строкам, блокируются, несмотря на использование уровня изоляции моментального снимка.

Кто-нибудь знает, почему это происходит и / или как я могу достичь истинно оптимистичного (неблокирующего) параллелизма?

Резолюция (неудачная для меня) : Ремус Русану отметил, что писатели всегда блокируют других писателей; это подтверждается MSDN - это не совсем так и звучит, но только упоминает об избежании блокировок чтения-записи. Короче говоря, нужное мне поведение не реализовано в SQL Server.

Ответы [ 2 ]

8 голосов
/ 25 июня 2009

Уровень изоляции SNAPSHOT влияет, как и все уровни изоляции, только на чтение. Пишет до сих пор блокируют друг друга. Если вы считаете, что то, что вы видите, представляют собой блоки чтения, вам следует провести дальнейшее расследование и проверить типы ресурсов и имена ресурсов, для которых происходит блокировка (wait_type и wait_resource в sys.dm_exec_requests ).

Я бы не советовал вносить изменения в код, чтобы поддержать сценарий, который предполагает, что разработчики смотрят на отладчик в течение нескольких минут подряд. Если вы считаете, что этот сценарий может повториться в производстве (т. Е. Клиент зависает), то это уже другая история. Чтобы достичь желаемого, вы должны минимизировать число операций записи и выполнять все операции записи в конце транзакции в одном вызове, который фиксируется до возврата. Таким образом, ни один клиент не может долго удерживать X-блокировки (не может зависать, удерживая X-блокировки). На практике это довольно сложно осуществить и требует от разработчиков большой дисциплины в том, как они пишут код доступа к данным.

2 голосов
/ 25 июня 2009

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

Вот шаги:

ALTER DATABASE <databasename>
SET READ_COMMITTED_SNAPSHOT ON;
GO

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

После включения базы данных для изоляции моментальных снимков разработчики и пользователи должны запросить выполнение своих транзакций в этом режиме моментального снимка. Это должно быть сделано перед началом транзакции, либо с помощью клиентской директивы в объекте транзакции ADO.NET, либо внутри их запроса Transact-SQL с помощью следующего оператора:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Raj

...