|
03.08.2017, 10:17 | #1 |
Участник
|
Цитата:
На первый взгляд, примерно такую защиту предоставляет табличка batchGlobal и код по ее блокировке в методах BatchRun::ServerGet* BatchRun::ServerProcess* Вы не пробовали просто ее задействовать ? Хотя возможно я ошибаюсь - глубоко не вникал. |
|
03.08.2017, 10:31 | #2 |
Участник
|
Цитата:
PS. Изменение уровня изоляции транзакций не улучшает ситуацию. PS2. Затыкания только в serverProcessDependencies недостаточно, надо лопатить во всех методах на изменение Batch. |
|
03.08.2017, 10:46 | #3 |
Участник
|
Откопал из загашников запросик, кажется это тот, на котором я ловил ошибочное поведение MS SQL :
X++: BEGIN TRAN UPDATE BATCH SET STATUS=5 WHERE ((STATUS=1) AND (CONSTRAINTTYPE=0)) AND EXISTS ( SELECT 'x' FROM BATCHJOB T2 WITH ( READCOMMITTEDLOCK) WHERE ((T2.STATUS=2) AND (BATCH.BATCHJOBID=T2.RECID)) AND NOT (EXISTS ( SELECT 'x' FROM BATCHCONSTRAINTS T3 WITH ( READCOMMITTEDLOCK) WHERE EXISTS ( SELECT 'x' FROM BATCH T4 WITH ( READCOMMITTEDLOCK) WHERE (((T3.DEPENDSONBATCHID=T4.RECID) AND (T3.BATCHID=BATCH.RECID)) AND ((((T4.STATUS<>3) AND (T4.STATUS<>4)) OR ((T3.EXPECTEDSTATUS=4) AND (T4.STATUS=3))) OR ((T3.EXPECTEDSTATUS=4) AND (T4.STATUS=3)))))))) --COMMIT TRAN --ROLLBACK TRAN 1. Создать тестовую среду 2. Открыть и запустить запросик в одном окне SSMS без завершения транзакции 3. Открыть и запустить запросик во втором окне SSMS без завершения транзакции 4. Завершить транзакции в первом и затем во втором окне (или наоборот) 5. Насладится результатами |
|
|
За это сообщение автора поблагодарили: Logger (5), Raven Melancholic (10). |
Теги |
ax2012, batch, batchrun, reqreaderwriterlock, баг, блокировки, закрытие склада |
|
|