数据回滚。在sql语句执行失败时,使用了此语句,可以将数据回滚到sql语句执行前的状态。
例如更新很多数据时,使用:
update ......
如果更新过程中出现错误,会导致数据混乱无法回复,
而使用了rollback:
if sql.code < 0 then
rollback就可以使数据回滚
例如更新很多数据时,使用:
update ......
如果更新过程中出现错误,会导致数据混乱无法回复,
而使用了rollback:
if sql.code < 0 then
rollback就可以使数据回滚
的操作恢复到事务执行前或某个指定位置.
如:
begin transaction my_transaction_delete
use pangu
go
delete from department
where dept_id = ’1012’
update employee
set dept_id = ’1001’
where dept_id = ’1012’
if @@error!=0 or @@rowcount=0 then
begin
rollback tran after_delete /* 回滚到保存点after_deletereturn,如果使用rollback my_transaction_delete 则会回滚到事务开始前 */
commit tran
print ‘更新员工信息表时产生错误’
return
end
commit transaction my_transaction_delete
go
do something
if @@error<>0 or @@rowcount
begin
rollback
retrun
end
commit
2:触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。
3:在批处理中,不执行所有位于激发触发器的语句之后的语句。
例如:
CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName (回到你那个保存点的操作.就是说它以后的操作都取消)
END
那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。
以下的触发器阐明了这一点:CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
BEGIN TRANSACTION
INSERT INTO TrigTarget
SELECT * FROM inserted
COMMIT TRANSACTION
ROLLBACK TRANSACTION
1:当rollback在:if @@error<>0后执行时将回滚整个批处理语句.
如果rollback不是在if @@error<>0后执行而是人为的执行时,只回滚rollback以前的语句,而在它后面的语句还会继续执行,因为在rollback之后将默认开始一个自动事务.
2:在事务中指定的事务名没有实际的功能,只是方便我们去阅读程序.注意:如果指定了with 那么此事务名将作为存储在事务日志中的标记,如果需要在将来的日志恢复当中可以回滚到此事务标记点.
3:一旦在事务中使用rollback,那么你无论是否指定事务名或指定哪个事务名,它都将会回滚到事务的开始处.而不能象commit那样与最近的begin transactin 匹配,组合成嵌套的事务.