SqlServer 2005: проблема взаимоблокировки без общих записей - PullRequest
5 голосов
/ 17 сентября 2009

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

тупик возникает, когда две такие транзакции выполняются одновременно:

begin transaction

update A set [value] = [value]
where id = 1; /* resp. 2 */

/* synchronize transactions here */

SELECT * 
FROM  
 A inner join B on A.B_FK = B.id
 inner join C on C.A_FK = A.id
WHERE 
 A.[value] = 1; /* resp. 2 */

rollback;

Это таблицы и данные для настройки сценария:

CREATE TABLE A (
  id INT NOT NULL,
  [value] INT,
  B_FK INT
  primary key (id)
)

CREATE TABLE B (
  id INT NOT NULL,
  primary key (id)
)

CREATE TABLE C (
  id INT NOT NULL,
  A_FK INT
  primary key (id)
)

INSERT INTO A VALUES(1, 1, 1) 
INSERT INTO B VALUES(1) 
INSERT INTO C VALUES(1, 1) 

INSERT INTO A VALUES(2, 2, 2) 
INSERT INTO B VALUES(2) 
INSERT INTO C VALUES(2, 2) 

Таблица A находится в середине трех таблиц. Если я что-то изменю в запросе, например удаляю одну из соединенных таблиц B или C, тупик не возникает. То же самое, когда я фильтрую по A.id вместо A.value.

График взаимоблокировки говорит мне, что они оба хотят установить S-блокировку для индекса первичного ключа таблицы A. Опять же: повышения блокировки нет.

Я использую SqlServer 2005.

  • Почему эти транзакции конфликтуют без доступа к каким-либо общим данным? Кто-нибудь может объяснить это?
  • Что я могу сделать, чтобы избежать этого? Я использую NHibernate и не могу изменить запрос так легко.
  • Может ли это быть проблема SqlServer?

Большое спасибо.

Ответы [ 2 ]

7 голосов
/ 17 сентября 2009

Конфликт может возникнуть, потому что SQL-Server блокирует не только на уровне строк, но и на уровне страниц или даже таблиц.

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

Укрощение блокировки SQL Server может быть полезно

1 голос
/ 17 сентября 2009

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

...