Sql 2005 Блокировка для OLTP - зафиксировано или незафиксировано? - PullRequest
1 голос
/ 02 февраля 2009

Администратор базы данных, нанятый моей компанией для устранения проблем взаимоблокировки, только что сказал мне, что наши проблемы с блокировкой баз данных OLTP улучшатся, если мы установим уровень транзакции READ COMMITTED из READ UNCOMMITTED.

Разве это не 100% ложь? READ COMMITTED вызовет больше блокировок, верно?


Подробнее:

Наши данные очень "разобраны" и зависят от пользователя. 99,999999% всех пользовательских взаимодействий работают с вашими собственными данными, и наши сценарии грязного чтения, если они произойдут, едва ли могут повлиять на то, что пытается сделать пользователь.


Спасибо за все ответы, рассматриваемый dba оказался бесполезным, и мы исправили проблемы с блокировкой, добавив один индекс.


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

Ответы [ 4 ]

5 голосов
/ 02 февраля 2009

Это звучит немного опрометчиво, однако без всех деталей вашей среды трудно сказать.

Вы должны посоветовать своему администратору баз данных рассмотреть возможность использования расширенных функций изоляции SQL Server, то есть использования методов управления версиями строк. Это было введено в SQL Server 2005 специально для решения проблем с базой данных OLTP, которые испытывают высокую блокировку.

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

http://msdn.microsoft.com/en-us/library/ms345124.aspx

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

Надеюсь, это поможет, но, пожалуйста, дайте мне знать, если вам потребуются дополнительные разъяснения.

Ура!

1 голос
/ 04 февраля 2009

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

READ UNCOMMITTED уменьшит количество блокировок, если вы блокируете данные из-за операторов SELECT. Если вы блокируете данные из-за операторов INSERT, UPDATE и DELETE, то изменение уровня изоляции на READ UNCOMMITTED ничего не изменит для вас. READ UNCOMMITTED имеет тот же эффект, что и добавление WITH (NOLOCK) к вашим запросам.

1 голос
/ 02 февраля 2009

Не зависит ли это от вашей проблемы: например, если ваша проблема - тупик, не может ли повышение уровня блокировки вызвать более раннее получение блокировок и, следовательно, снижение вероятности смертельного объятия?

0 голосов
/ 02 февраля 2009

Это звучит страшно. Вы действительно хотите просто изменить эти параметры, чтобы избежать тупиков? Может быть, данные должны быть заблокированы?

При этом возможно, что администратор базы данных ссылается на новый (начиная с SQL Server 2005) READ COMMITTED SNAPSHOT, который использует управление версиями строк и может устранить некоторые виды взаимоблокировок.

http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm

...