Показать сообщение отдельно
Старый 03.08.2017, 10:46   #8  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Откопал из загашников запросик, кажется это тот, на котором я ловил ошибочное поведение 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).