SET XACT_ABORT
一提到事务,也许,你的第一反应就是,要么全部执行,要么全部不执行,然而事实.............可以不是这样滴!
测试代码
CREATE TABLE TEST( ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), VAL VARCHAR(2) )
1.事务终止并全部回滚
SET XACT_ABORT ON BEGIN TRAN INSERT INTO TEST VALUES('11') INSERT INTO TEST VALUES('22') INSERT INTO TEST VALUES('3333') --超出字符长度 INSERT INTO TEST VALUES('44') COMMIT TRAN SELECT * FROM TEST --结果:没有值
2.只回滚错误行,语句还继续执行
SET XACT_ABORT OFF BEGIN TRAN INSERT INTO TEST VALUES('11') INSERT INTO TEST VALUES('22') INSERT INTO TEST VALUES('3333') --超出字符长度 INSERT INTO TEST VALUES('44') COMMIT TRAN SELECT * FROM TEST --结果: /* ID VAL 4 11 5 22 7 44 */
3.事务在错误行终止,错误行回滚,错误行之前的不回滚
每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚.(BENGIN END)
DELETE FROM TEST SET XACT_ABORT ON BEGIN INSERT INTO TEST VALUES('11') INSERT INTO TEST VALUES('22') INSERT INTO TEST VALUES('3333') --超出字符长度 INSERT INTO TEST VALUES('44') END SELECT * FROM TEST --结果: /* ID VAL 8 11 9 22 */