IX и S блокироки приводят к дедлоку

slyke
Дата: 27.01.2009 22:24:35
Добрый вечер.

Такая ситуация. две транзакции периодически запускаются почти одновременно. В первом конекшене простой селект из таблицы, во втором идет вставка записей в эту таблицу. Селект накладывает S блокировку на нужную ему страницу (Page_1), а инсерт накладывает на другую нужную ему страницу IX блокировку (Page_2), в это же время селекту уже нужны данные с Page_2, но на ней уже висит IX, поэтому селект не может наложить S блокировку на Page_2 и вынужден ждать. Пока он ждет инсерту уже нужна Page_1, но на нее селект уже повесил S блокировку, и инсерт не может повесить IX на Page_1 - получается дедлок.

Как по-вашему можно разрешить эту проблему с наименьшими потерями для перфоманса? Если нужно, то напишу дополнительную информацию. Заранее спасибо.
Crimean
Дата: 27.01.2009 22:27:02
да, граф дедлока был бы полезен. если страничная природа подтвердится - часто индексы помогают. для "простого селекта" так точно :)
slyke
Дата: 27.01.2009 22:30:14
есть только такой:
slyke
Дата: 27.01.2009 22:43:51
Селект из таблицы содержит условие по 3-м полям, одно поле входит в составной индекс, в конце селекта идет группировка по 2-м неиндексируемым полям.
Senya_L
Дата: 27.01.2009 22:51:09

> Автор: slyke
> Селект из таблицы содержит условие по 3-м полям, одно поле входит в
> составной индекс, в конце селекта идет группировка по 2-м неиндексируемым
> полям.
>

А селект выполняется в рамках какого уровня изоляции?

Posted via ActualForum NNTP Server 1.4

Amorph
Дата: 27.01.2009 23:31:06
Senya_L

> Автор: slyke

А селект выполняется в рамках какого уровня изоляции?



судя по всему READ COMMITTED
slyke
Дата: 27.01.2009 23:48:22
Да, селект по дефолту с READ COMMITTED выполняется. А в процедуре, которая вставляет записи в таблицу, установлен READ UNCOMMITTED.
tpg
Дата: 28.01.2009 06:53:00
На свой селект натравите тьюниг адвизор - возможно он предложит вам нужный индекс.
Senya_L
Дата: 28.01.2009 09:28:12
Я с дедлоками знаком только теоретически. Разъясните, пожалуйста, для самообразования. Почему SELECT накладывает блокировки? Я так думал, что такое происходит при IL = REPEATABLE READ.
tpg
Дата: 28.01.2009 09:58:59
Senya_L
Я с дедлоками знаком только теоретически. Разъясните, пожалуйста, для самообразования. Почему SELECT накладывает блокировки? Я так думал, что такое происходит при IL = REPEATABLE READ.
Потому, что сиквел - блокировочник и блокировки накладывает всегда, за исключением случаев грязного чтения.
Другое дело - когда он их снимает... А вот это уже зависит от TIL.