Откопал из загашников запросик, кажется это тот, на котором я ловил ошибочное поведение 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. Насладится результатами