Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Незакрытые транзакции
|
|||
|---|---|---|---|
|
#18+
Доброго всем времени суток ! Возникла проблема со stored procedure , доставшейся "по наследству" Общий вид SP: CREATE PROCEDURE sp_Compute AS DECLARE .... /* объявление переменных */ BEGIN TRANSACTION T1 DECLARE OrderPositionCursor CURSOR FAST_FORWARD FOR SELECT * FROM OrderPosition with(nolock) OPEN tblOrderPosition FETCH NEXT FROM OrderPositionCursor into @SourceId, .... BEGIN TRANSACTION T2 WHILE (@@fetch_status = 0) BEGIN /* Собственно логика обработки */ SkipOrderPosition: IF @iCounter % 1000 = 0 BEGIN /* Промежуточная фиксация обработанных данных */ COMMIT TRANSACTION T2 /* вывод служебной информации и старт транзакции */ BEGIN TRANSACTION T2 END SET @iCounter = @iCounter + 1 FETCH NEXT FROM OrderPositionCursor INTO @SourceId, .... END COMMIT TRANSACTION T2 CLOSE OrderPositionCursor DEALLOCATE OrderPositionCursor COMMIT TRANSACTION T1 Суть проблемы: Среда - Windows 2000 Adv.server (German) , MS SQL Server 7.0 (German) В процессе работы процедура в непредсказуемый момент времени финиширует без каких-либо сообщений об ошибках, оставляя незакрытыми транзакции T2 и T1. Соответственно, ресурсы, к которым она обращалась, остаются заблокированными. Если в Enterpr.Managere убить процесс (либо закрыть программу, вызвавшую эту sp ), то T1 откатывается назад и сносит результаты расчета. Попытка оттрассировать ни к каким результатам не привела. При запуске в QA как самого кода, так и процедуры с теми же параметрами, которые идут от вызывающей программы - никаких проблем. При запуске на MS SQL Server 2000 - так же все в ажуре. Проблема возникает только на "семерке". Процедура используется более 2 лет и подозрений до сих пор не вызывала. Буду признателен за любые идеи, версии и советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2001, 14:23 |
|
||
|
Незакрытые транзакции
|
|||
|---|---|---|---|
|
#18+
Попробуй так: CREATE PROCEDURE sp_Compute AS DECLARE .... /* объявление переменных */ BEGIN TRANSACTION T1 DECLARE OrderPositionCursor CURSOR FAST_FORWARD FOR SELECT * FROM OrderPosition with(nolock) OPEN tblOrderPosition FETCH NEXT FROM OrderPositionCursor into @SourceId, .... WHILE (@@fetch_status = 0) BEGIN /* Собственно логика обработки */ SkipOrderPosition: IF @iCounter % 1000 = 0 SET @iCounter = @iCounter + 1 FETCH NEXT FROM OrderPositionCursor INTO @SourceId, .... END CLOSE OrderPositionCursor DEALLOCATE OrderPositionCursor COMMIT TRANSACTION T1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2001, 15:57 |
|
||
|
Незакрытые транзакции
|
|||
|---|---|---|---|
|
#18+
2Владимир И что это решает? @iCounter - это просто счетчик обработанных записей ... значение которого периодически (сразу после фиксации порции обработанных данных)скидывается в отдельную табличку, чтобы иметь возможность отслеживать процесс обработки. Да и вопрос-то был не об этом ... Непонятно, почему так повела себя хранимая процедура . Проблема возникла на короткой порции данных (таблица около 60000 строк), хотя ранее и 4 млн записей обрабатывалось без проблем. Возможно, кто-то сталкивался с подобной проблемой ("тихим" вылетом из sp) при вложенных транзакциях, или при использовании транзакций совместно с курсорами , как бы идиотски это не звучало. Я сам пока не знаю, с какой стороны к проблеме подступиться - при трассировке либо при отдельном запуске sp с параметрами (специально в отладчике прошелся по проге, чтобы получить , что же точно она передает как параметры при вызове sp)- все прекрасно и никаких проблем ! Сложности возникают, когда в штатном режиме sp вызывается из exe-шника. Перенести обработку с SQL7 на SQL2000 по ряду причин я пока не могу. Так что надо разбираться. Вызывает смутные сомнения, правильно ли то, что транзакция T2 первый раз открывается ДО входа в цикл, затем ВНУТРИ цикла закрывается и открывается вновь, чтобы закрыться уже ЗА пределами цикла. Формально это влиять не должно, но возможно, в силу каких-то особенностей реализации "семерки" эта конструкция некорректна . С другой стороны, она достаточно долго отработала, и проблем не вызывала. Так что вопрос пока открыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2001, 22:04 |
|
||
|
Незакрытые транзакции
|
|||
|---|---|---|---|
|
#18+
Дополнение к предыдущему постингу. /* Собственно логика обработки */ - этот комментарий заменяет собой много-много строчек с простыми, преимущественно математическими операциями. На возможность некорректного типа данных либо превышения размерности уже проверил - не то. Похоже, проблема кроется именно в обработке транзакций, но в чем суть - понять пока не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2001, 22:13 |
|
||
|
Незакрытые транзакции
|
|||
|---|---|---|---|
|
#18+
2Udacha: Во первых тут без разницы 7 или 2000..Во вторых,при обьявлении курсора и последующей обработки записей все это недолжно быть использовано с промежуточными транзакциями...Какой специалист это творил - загадка природы...Но я просто рекомендую убрать этот бред из текста и попробовать снова. Если количество записей велико и есть желание сохранить результат, то тут нужен другой подход... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2001, 23:35 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3527&tid=1824800]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 322ms |

| 0 / 0 |
