Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 deadlock victim при операции SELECT  [new]
victorov1
Member

Откуда:
Сообщений: 50
подключаюсь к БД и делаю единственный запрос:

SELECT * FROM t;

получаю:
Transaction (Process ID ХХХ) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction

БД удаленная у заказчика и собрать логи, графы пока проблематично,
но интересует главный вопрос: как теоретически возможен DEADLOCK для SELECT-операции?
Кто-нибудь может привести пример, чтобы можно было у себя повторить?
17 ноя 21, 22:56    [22397225]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
komrad
Member

Откуда:
Сообщений: 5910
victorov1,

это легко гуглится, пробовали?

+ ответ
https://stackoverflow.com/questions/5826600/transaction-deadlock-for-select-query


Сообщение было отредактировано: 17 ноя 21, 23:01
17 ноя 21, 23:00    [22397227]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
victorov1
Member

Откуда:
Сообщений: 50
конечно читал, но там только теоретически рассуждения о том, что да, такое возможно...
а мне нужен бы конкретный пример, чтобы мог у себя повторить и проанализировать
вот примера я не нашел, как именно UPDATE/INSERT может в паре с SELECT в другом процессе спровоцировать deadlock
17 ноя 21, 23:06    [22397230]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1909
victorov1,

drop table if exists d1, d2;

create table d1 (id int);
create table d2 (id int);


последовательно выполнить:
--session 1
begin tran;
select * from d1 with(tablockx);


--session 2
begin tran;
select * from d2 with(tablockx);


--session 1
select * from d2;


--session 2
select * from d1;
17 ноя 21, 23:22    [22397234]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
victorov1
Member

Откуда:
Сообщений: 50
так это не то...

повторюсь - в моей сессии только лишь только:
SELECT * FROM t
go

и больше ничего!
как такая сессия может спровоцировать deadlock?
17 ноя 21, 23:32    [22397236]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
komrad
Member

Откуда:
Сообщений: 5910
victorov1
конечно читал, но там только теоретически рассуждения о том, что да, такое возможно...
а мне нужен бы конкретный пример, чтобы мог у себя повторить и проанализировать
вот примера я не нашел, как именно UPDATE/INSERT может в паре с SELECT в другом процессе спровоцировать deadlock


на ваш вопрос

victorov1
но интересует главный вопрос: как теоретически возможен DEADLOCK для SELECT-операции?

(выделение авторское)


там есть ответ:

1
SELECT queries take shared locks on the rows they analyze. Shared locks may conflict exclusive locks from update/delete/insert statements. Two SELECT statements are not going to deadlock, but a SELECT can deadlock with an UPDATE. When such deadlock occurs, the SELECT is usually the victim as it did not perform any update so is always going to loose the draw.


2
you are getting the deadlocks because SELECT and UPDATE (or other) operations deadlocking each other, not SELECT vs SELECT. You will have to look at all your queries touching that table and create proper covering indexes for those queries and that will solve your problems. Good covering indexes is the preferred solution rather than using WITH (NOLOCK) table hints.
17 ноя 21, 23:57    [22397240]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1909
victorov1,

граф что ли покажите тогда.

у вас вторая транзакция тогда точно помимо обычного select без подсказок использовала dml
18 ноя 21, 01:58    [22397257]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
aleks222
Member

Откуда:
Сообщений: 1846
victorov1
так это не то...

повторюсь - в моей сессии только лишь только:
SELECT * FROM t
go

и больше ничего!
как такая сессия может спровоцировать deadlock?


Так это в твоей сессии select.
Чаво в другой сессии - ты не показываешь.
А там update.

ВашЪ КО.
18 ноя 21, 06:14    [22397273]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
L_argo
Member

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

А если попробовать SELECT * from MyTable WITH(NOLOCK) ?

Может уменьшить проблему.
18 ноя 21, 12:06    [22397388]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
msLex
Member

Откуда:
Сообщений: 9542
L_argo
мягкую блокировку


S = Shared
18 ноя 21, 12:15    [22397395]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
victorov1


как теоретически возможен DEADLOCK для SELECT-операции?


LOCK_ESCALATION и другими способами, ибо нефиг всю таблицу селектить .
18 ноя 21, 16:40    [22397591]     Ответить | Цитировать Сообщить модератору
 Re: deadlock victim при операции SELECT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
victorov1,

with another process означает конфликт с другим процессом, сеансом.
18 ноя 21, 17:38    [22397631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить