SQL事务回滚
BEGIN TRAN标记事务开始 COMMIT TRAN 提交事务 一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN 之间作为一个事务处理 也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGIN TRAN之前的状态。 联机帮助:当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 1、回滚语句1: SET XACT_ABORT OFF BEGIN TRAN INSERT INTO score VALUES (101,90) INSERT INTO score VALUES (102,78) INSERT INTO score VALUES (107,76) /**//* Foreign Key Error */ INSERT INTO score VALUES (103,81) INSERT INTO score VALUES (104,65) COMMIT TRAN go 结果1:只回滚错误行,语句还继续执行。 --select * from score 101 90 102 78 103 81 104 65 2、回滚语句2: SET XACT_ABORT on BEGIN TRAN INSERT INTO score VALUES (101,90) INSERT INTO score VALUES (102,78) INSERT INTO score VALUES (107,76) /**//* Foreign Key Error */ INSERT INTO score VALUES (103,81) INSERT INTO score VALUES (104,65) COMMIT TRAN go 结果2:事务终止并全部回滚,结果为空。 --select * from score 3、回滚语句3: 事务在错误行终止,错误行回滚,错误行之前的不回滚 SET XACT_ABORT on BEGIN INSERT INTO score VALUES (101,90) INSERT INTO score VALUES (102,78) INSERT INTO score VALUES (107,76) /**//* Foreign Key Error */ INSERT INTO score VALUES (103,81) INSERT INTO score VALUES (104,65) END go 结果3:出现这种是因为系统把每个insert语句都看成是单独的事务,所以错误行以前的是不回滚的。 --select * from score 101 90 102 78