Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. / 12 сообщений из 12, страница 1 из 1
03.05.2018, 12:09
    #39639286
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Всем привет!
Версия SQL:

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
Aug 15 2017 10:23:29
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

Есть многопользовательская OLTP система. Часто возникают конфликты транзакций.
Текст примерно такой: "Транзакция (идентификатор процесса XXX) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно."

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

Соответственно вопрос :) - Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.

Блокировки появляются в "сложных" хранимках, где есть несколько update. Ниже я привёл три примера. Первый пример - как есть сейчас. Остальные, наверное, как должно быть.
Обёртку в транзакции я сделал не для того, чтобы сохранялась целостность операции, а для того чтобы избежать блокировок. Возможно я ошибаюсь, подскажите как правильно?

Пример 1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE myProc
AS
BEGIN
 -- без явного указания транзакций
 SET NOCOUNT ON;

 update myTable set 
  f1 = 1
 where f2 = 1

 update myTable set 
  f1 = 2
 where f2 = 2

 update myTable set 
  f1 = 3
 where f2 = 3

END



Пример 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE PROCEDURE myProc
AS
BEGIN
 -- одна транзакция на всю процедуру
 SET NOCOUNT ON;
 
 begin tran 

  update myTable set 
   f1 = 1
  where f2 = 1

  update myTable set 
   f1 = 2
  where f2 = 2

  update myTable set 
   f1 = 3
  where f2 = 3
 
 commit

END



Пример 3
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE PROCEDURE myProc
AS
BEGIN
 -- отдельная транзакция для каждого update
 SET NOCOUNT ON;

 begin tran 
  update myTable set 
   f1 = 1
  where f2 = 1
 commit

 begin tran
  update myTable set 
   f1 = 2
  where f2 = 2
 commit

 begin tran
  update myTable set 
   f1 = 3
  where f2 = 3
 commit

END
...
Рейтинг: 0 / 0
03.05.2018, 12:42
    #39639330
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Mandarin,

пример 1 и 3 - это одно и то же.
...
Рейтинг: 0 / 0
03.05.2018, 12:46
    #39639336
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Mandarin,

Есть ли индексы на f2?
У вас с таким кодом могут открытые транзакции остаться, в инете полно "шаблонов" для хранимок, типо http://jackworthen.com/2015/10/29/a-good-stored-procedure-template/
...
Рейтинг: 0 / 0
03.05.2018, 12:51
    #39639340
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
aleksrov,

Индексы в таблицах есть, и кластерные (первичный ключ, int автоинкрементный) и не кластерные.
...
Рейтинг: 0 / 0
03.05.2018, 14:47
    #39639456
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
MandarinВозможно я ошибаюсь, подскажите как правильно?


1. Чем крупнее транзакция - тем больше вероятность смертельных блокировок.
2. Поэтому, если целостность не нужна - транзакция тоже не нужна.
3. Все остальное решается по графу смертельной блокировки.
4. Если не решается - изучаем понятие критической секции - ваяем критическую секцию.
...
Рейтинг: 0 / 0
03.05.2018, 17:55
    #39639604
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
aleks222MandarinВозможно я ошибаюсь, подскажите как правильно?


1. Чем крупнее транзакция - тем больше вероятность смертельных блокировок.
2. Поэтому, если целостность не нужна - транзакция тоже не нужна.
3. Все остальное решается по графу смертельной блокировки.
4. Если не решается - изучаем понятие критической секции - ваяем критическую секцию.

Если целостность не нужна, как отказаться от транзакции в хранимой процедуре (Пример 1)
Если совсем отказаться от транзакции нельзя, то какой уровень транзакции надо задать чтобы максимально снизить возможность блокировок?
...
Рейтинг: 0 / 0
03.05.2018, 19:07
    #39639632
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Mandarin,

Уровень изоляции ставится в зависимости от требований системы (т.е. к примеру допускаются ли фантомные строки), а не для того чтобы избавиться от блокировок.
Смотрите граф дедлока в общем.
...
Рейтинг: 0 / 0
04.05.2018, 10:11
    #39639838
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
aleksrov,

Предположим посмотрел я граф дедлоков, увидел там что proc1 блокирует proc2, это я и без графа знал, дальше то что ? :)
...
Рейтинг: 0 / 0
04.05.2018, 11:02
    #39639901
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Mandarinaleksrov,

Предположим посмотрел я граф дедлоков, увидел там что proc1 блокирует proc2, это я и без графа знал, дальше то что ? :)
неправильно посмотрел.
в графе есть resource list,
где перечислены ресурсы, и к каждому указан owner и waiter
...
Рейтинг: 0 / 0
04.05.2018, 11:18
    #39639906
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Mandarin,

проблема не в транзакции, а в порядке и типе наложения блокировок. Сервер пишет "транзакция", чтобы вы, при желании, могли бы понять - какая именно транзакция не была зафиксирована из-за конфликта блокировок. Ищите, где потеряли, а не там, где светло.

Измените архитектуру базы так, чтобы максимально избежать обновлений строк, которые участвуют в поиске, например.
...
Рейтинг: 0 / 0
04.05.2018, 14:01
    #39640044
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
Владислав Колосов,

Спасибо за советы, буду пробовать.
Подскажите ещё один момент, если я вызываю одну хранимую процедуру из другой, то каждый вызов хранимки будет в отдельной транзакции?
...
Рейтинг: 0 / 0
04.05.2018, 16:45
    #39640210
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах.
MandarinВладислав Колосов,

Спасибо за советы, буду пробовать.
Подскажите ещё один момент, если я вызываю одну хранимую процедуру из другой, то каждый вызов хранимки будет в отдельной транзакции?

Процедура не обязана выполняться в транзакции.

Это воля "программизда".
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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