powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / deadlocks
16 сообщений из 16, страница 1 из 1
deadlocks
    #32014332
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, помогите пожалуйста ответить на следующий вопрос о мёртвых блокировках:
What Transact-SQL feature (or complexity) is normally required for deadlocks to occur, but how (why?) might they also occur in a simple situation?
...
Рейтинг: 0 / 0
deadlocks
    #32014339
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. BOL: Contents->Accessing and Changing Relational Data->Locking->Customizing Locking with SQL Server->Deadlocking.
Или в индексе набери deadlock и получишь сслыки на несколько статей.

Там подробно все описано, даже с картинками
...
Рейтинг: 0 / 0
deadlocks
    #32014341
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там много статей, но всё слишком общо. Хотелось бы поконкретнее. Какое свойство языка Transact SQL является типичной причиной мертвых блокировок? Можно ли привести элементарный пример (без использования этого свойства), в котором возникает deadlock?
...
Рейтинг: 0 / 0
deadlocks
    #32014342
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы все внимательно прочитали, то как же вы не увидели пример


Guaranteed Deadlock (Concurrent Trsnsactions)
Transaction One Transaction Two

Begin Transaction Begin Transaction
Update Table Supplier Update Table Part
Update Table Part Update Table Supplier
Commit Transaction Commit Transaction


т.е. к Deadlock-у может привести последовательность команд, хотя каждая команда в отдельности может и не вызывать Deadlock.

Или какой смысл тогда вы вкладываете в слова "Какое свойство языка Transact SQL является типичной причиной мертвых блокировок? " ? Есть ли специальная команда START DEADLOCK?
...
Рейтинг: 0 / 0
deadlocks
    #32014344
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Я этот пример конечно же увидел. Мои сомнения в том, что вопросы немного не об этом.
Если на первый из вопросов ответ: "Одновременно работающие транзакции", то приведенный пример не подходит в качестве ответа на второй вопрос, так как там требуется привести пример без использования свойства, указанного в ответе на вопрос 1.
...
Рейтинг: 0 / 0
deadlocks
    #32014348
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например


declare @i int
set @i = 0
while @i < 1000000
begin
select * from mytable options(tablockx)
/*на таблицу будет наложена экслюзивная блокировка до окончания выполнения запроса */
set @i = @i + 1
end
...
Рейтинг: 0 / 0
deadlocks
    #32014353
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я запустил этот пример в Query Analyzer, поставив 1000 вместо 1000000. Выполнилось за 1 сек без сообщений об ошибках и предупреждений.
...
Рейтинг: 0 / 0
deadlocks
    #32014354
Barabanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не согласен с Glory, последний пример - это не deadlock. BOL:A deadlock occurs when there is a cyclic dependency between _two_ or _more_ threads for some set of resources.
...
Рейтинг: 0 / 0
deadlocks
    #32014356
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory, аплодисменты по поводу "START DEADLOCK"!!! Для меня это стало зарядом бодрости на весь день


>Какое свойство языка Transact SQL является типичной причиной мертвых блокировок?
Это бессмысленный вопрос. И вообще, что такое "свойство языка Transact SQL"? Что-то не припоминаю такого термина.

Пример Guaranteed Deadlock - отличная иллюстрация. Куда проще-то. Хочу напомнить, что транзакции бывают не только явные. Совершенно аналогичный пример можно написать, сделав конфликт между потоком, пишущим в таблицу, на которую повешен триггер и потоком, читающим из таблицы, изменения в которую вносит вышеупомянутый триггер. Будет то же самое, только якобы без транзакций. Хотя реально это окажется все тот же Guaranteed Deadlock.

Vasia, ты хоть объясни, чего нужно-то?
...
Рейтинг: 0 / 0
deadlocks
    #32014357
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Vasia
Так вы пытаетесь получить deadlock из одного и того же коннекта ? Deadlock может возникнкть как минимум для двух коннектов.


в таблице mytable ~100 000 000 записей
1-ый коннект 2-ой коннект
select top 10 * from mytable select * from mytable
~1 сек ~ 30 мин

select top 10 * from mytable select * from mytable options(tablockx)
~30 мин + 1 сек ~ 30 мин



а пример с циклом я предложил из рассчета, что у вас наверное нет такой большой таблицы. Наверное неудачный пример, согласен с Barabanov
...
Рейтинг: 0 / 0
deadlocks
    #32014361
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2GreenSunrise:
START DEADLOCK мне тоже понравилось, но, к сожалению, формулировку исходного вопроса (на
англ. языке) придумал не я. Мне тоже не 100% понятно, что в нём имеется ввиду, почему речь идёт о Transact-SQL feature, а не о SQL Server feature.

2Glory:
Запуск первого примера из двух коннектов не привел к deadlock - оба запроса успешно отработали примерно за равное время.
Второй пример иллюстрирует lock, а не deadlock. Ведь оба коннекта дорабатывают до конца, пусть и по очереди. В случае deadlock SQL выдает сообщение и выбирает жертву. Как бы придумать простой пример, в котором бы этот эффект наблюдался?
...
Рейтинг: 0 / 0
deadlocks
    #32014363
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, а... Чем тебя не устраивает Guaranteed Deadlock, выдранный из BOL и приведенный здесь Glory? Проще не бывает!
...
Рейтинг: 0 / 0
deadlocks
    #32014364
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2GreenSunrise

Идея устраивает, но мне не удается написать соответствующий SQL, чтобы возникло сообщение о deadlock.
...
Рейтинг: 0 / 0
deadlocks
    #32014365
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрипт:
create table t1(
col1_1 int,
col1_2 sysname
)
go

create table t2(
col2_1 int,
col2_2 sysname
)
go

insert into t1 values (1, '1')
insert into t2 values (2, '2')

Теперь сценарий, как добиться дедлока.

1. Открываем 1-й коннект. Выполняем
begin tran
update t1 set col1_2 = '11'
2. Открываем 2-й коннект. Выполняем
begin tran
update t2 set col2_2 = '222'
3. На 1-м коннекте выполняем
update t2 set col2_2 = '22'
4. На 2-м коннекте выполняем
update t1 set col1_2 = '111'
5. На 2-м коннекте получаем сообщение
"Transaction (Process ID 61) was deadlocked on {lock} resources with another process and has been chosen as the deadlock victim. Rerun the transaction."

Так пойдет?
...
Рейтинг: 0 / 0
deadlocks
    #32014368
Vasia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2GreenSunrise

Сработало! Огромное спасибо!
...
Рейтинг: 0 / 0
deadlocks
    #32014372
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(Задумчиво так...) Знаешь, меня первый раз в жизни БЛАГОДАРЯТ за deadlock!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / deadlocks
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]