Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
03.05.2018, 12:09
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Всем привет! Версия 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. Пример 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. Пример 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 12:42
|
|||
|---|---|---|---|
|
|||
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Mandarin, пример 1 и 3 - это одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 12:46
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Mandarin, Есть ли индексы на f2? У вас с таким кодом могут открытые транзакции остаться, в инете полно "шаблонов" для хранимок, типо http://jackworthen.com/2015/10/29/a-good-stored-procedure-template/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 12:51
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
aleksrov, Индексы в таблицах есть, и кластерные (первичный ключ, int автоинкрементный) и не кластерные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 14:47
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
MandarinВозможно я ошибаюсь, подскажите как правильно? 1. Чем крупнее транзакция - тем больше вероятность смертельных блокировок. 2. Поэтому, если целостность не нужна - транзакция тоже не нужна. 3. Все остальное решается по графу смертельной блокировки. 4. Если не решается - изучаем понятие критической секции - ваяем критическую секцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 17:55
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
aleks222MandarinВозможно я ошибаюсь, подскажите как правильно? 1. Чем крупнее транзакция - тем больше вероятность смертельных блокировок. 2. Поэтому, если целостность не нужна - транзакция тоже не нужна. 3. Все остальное решается по графу смертельной блокировки. 4. Если не решается - изучаем понятие критической секции - ваяем критическую секцию. Если целостность не нужна, как отказаться от транзакции в хранимой процедуре (Пример 1) Если совсем отказаться от транзакции нельзя, то какой уровень транзакции надо задать чтобы максимально снизить возможность блокировок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.05.2018, 19:07
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Mandarin, Уровень изоляции ставится в зависимости от требований системы (т.е. к примеру допускаются ли фантомные строки), а не для того чтобы избавиться от блокировок. Смотрите граф дедлока в общем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.05.2018, 10:11
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
aleksrov, Предположим посмотрел я граф дедлоков, увидел там что proc1 блокирует proc2, это я и без графа знал, дальше то что ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.05.2018, 11:02
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Mandarinaleksrov, Предположим посмотрел я граф дедлоков, увидел там что proc1 блокирует proc2, это я и без графа знал, дальше то что ? :) неправильно посмотрел. в графе есть resource list, где перечислены ресурсы, и к каждому указан owner и waiter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.05.2018, 11:18
|
|||
|---|---|---|---|
|
|||
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Mandarin, проблема не в транзакции, а в порядке и типе наложения блокировок. Сервер пишет "транзакция", чтобы вы, при желании, могли бы понять - какая именно транзакция не была зафиксирована из-за конфликта блокировок. Ищите, где потеряли, а не там, где светло. Измените архитектуру базы так, чтобы максимально избежать обновлений строк, которые участвуют в поиске, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.05.2018, 14:01
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
Владислав Колосов, Спасибо за советы, буду пробовать. Подскажите ещё один момент, если я вызываю одну хранимую процедуру из другой, то каждый вызов хранимки будет в отдельной транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.05.2018, 16:45
|
|||
|---|---|---|---|
Помогите пожалуйста понять, как работают транзакции в хранимых процедурах. |
|||
|
#18+
MandarinВладислав Колосов, Спасибо за советы, буду пробовать. Подскажите ещё один момент, если я вызываю одну хранимую процедуру из другой, то каждый вызов хранимки будет в отдельной транзакции? Процедура не обязана выполняться в транзакции. Это воля "программизда". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&tablet=1&tid=1689797]: |
0ms |
get settings: |
6ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 391ms |

| 0 / 0 |
