Блокировки БД требуют транзакций?
Правда ли, что "каждый оператор (выбрать / вставить / удалить / обновить) имеет уровень изоляции независимо от транзакций"?
У меня есть сценарий, в котором я установил обновление операторов внутри транзакции (ReadCommitted). И другой набор не в транзакции (выберите операторы).
- В этом случае, когда выполняется первый набор, другой ожидает.
Если я установлю READ_COMMITTED_SNAPSHOT для БД, возникает тупик.
ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
Чтобы решить эту проблему, нужно ли поместить операторы "Выбрать" в TransactionScope?
1 ответ
В SQL Server каждая транзакция имеет неявный или явный уровень транзакции. Явный, если вызывается с BEGIN/COMMIT/ROLLBACK TRANSACTION
неявно, если ничего подобного не выдается.
Запустите ваш снимок до начала запроса на обновление. В противном случае вы не дадите SQL Server подготовить измененные строки в базу данных tempdb, а в запросе на обновление блокировка будет по-прежнему открыта.
Другой способ без создания изоляции снимка состоит в использовании SELECT <columns> FROM <table> WITH (NOLOCK)
это способ сказать SQL Server, что нужно получать строки, несмотря ни на что (иначе READ_UNCOMMITED). Так как это подсказка запроса, она меняет уровень изоляции даже с вашими настройками. Может работать, если вас не беспокоит, какое состояние строки запрашивается, однако при оценке полученных данных необходимо соблюдать осторожность.