Как решить lck_m_x Lock в sql - PullRequest
       18

Как решить lck_m_x Lock в sql

1 голос
/ 03 апреля 2012

У меня сложный запрос (без подсказок о блокировке), который берет данные из многих таблиц, например, Table1, Table2, Table3

Ниже приведен код для получения данных (транзакций нет)

  IDbCommand sqlCmd = dbHelper.CreateCommand(Helper.MyConnString, sbSQL.ToString(), CommandType.Text, arParms);
  sqlCmd.CommandTimeout = 300;
  ds = dbHelper.ExecuteDataset(sqlCmd);

В приложении этот запрос выполняется каждые 2 минуты

Когда я запускаю простой запрос на обновление, скажем

Update Table1 set Col1='abc' where ID=100  

(где ID - это int, а первичный ключ + кластерный индекс)

запрос на обновление задерживается и много раз истекает. Ниже приведен журнал enter image description here

Как мне это исправить.

Ответы [ 2 ]

1 голос
/ 24 декабря 2013

Если вы не хотите ждать чтения запросов во время изменения данных, лучше всего использовать READ_COMMITTED_SNAPSHOT .

Он может быть включен прозрачно, не затрагивать код приложения и не имеет побочных эффектов.

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

1 голос
/ 03 апреля 2012

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

Для справки посмотрите Работа с изоляцией моментальных снимков и УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ на MSDN.

РЕДАКТИРОВАТЬ из-за комментария:

Сначала включите ALLOW_SNAPSHOT_ISOLATION для вашей базы данных:

ALTER DATABASE YourDB SET ALLOW_SNAPSHOT_ISOLATION ON

Затем напишите свой запрос следующим образом:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

SELECT      Column1, Columns2, ...
FROM        Table1
LEFT JOIN   Table2
ON          Table1.Columns45 = Table2.Column3
[... your complex query ...]

Этого достаточно дляпример?

...