Begin TransAction 开始事务
rollback TransAction 提交事务
Commit TransAction 回滚事务
USE pubs
DECLARE @intErrorCode INT
BEGIN TRAN
UPDATE Authors SET Phone = '415 354-9866' WHERE au_id = '724-80-9391'
SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM
UPDATE Publishers SET city = 'Calcutta', country = 'India' WHERE pub_id = '9999'
SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN
PROBLEM:
IF (@intErrorCode <> 0) BEGIN
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
END
在真正处理开始之前,使用BEGIN TRAN标记:下面所有的动作作为一个事务。里边包含两个update语句。如果没有出错,当执行到COMMIT TRAN所有的改变被提交到数据库,存储过程完成。如果在执行update出错,通过检测@@ERROR,跳转到PROBLEM标签,显示错误信息,回滚这期间所有的修改。
注意:确保BEGIN TRAN 和COMMIT 或 ROLLBACK成对出现
SQL Server 容许你嵌套事务,这个特性意味着,即使上一个事务没有完成,也能开启一个新事务。T-SQL容许你通过嵌套BEGIN TRAN嵌套事务。 内置变量@@TRANCOUNT可显示事务的嵌套层级。0表示没有嵌套,1表示嵌套一层,依此类推。
保存点提供了事务部分回滚的机制。用户能在事务内部设置保存点或标记。保存点定义一个当事务被撤销时,回滚的位置。SQL Server容许用户通过SAVE TRAN语句定义保存点。申明保存点不影响@@TRANCOUNT的值,回滚到保存点也不影响@@TRANCOUNT。回滚必须ROLLBACK TRAN带有保存点的名称,否则回滚整个事务。
当一个错误出现时,你所能做的是:终止代码执行顺序。要么把代码路由到别的代码,或者返回终止程序。@@ERROR这个系统变量常用来实现错误处理。它包含SQL语句最后执行错误的代码。当代码执行成功, @@ERROR的值是0,当代码执行完成,立即使用IF语句判断@@ERROR的值。这是因为当下一个语句执行成功时,@@ERROR的值会被重置为0。所以必须立即捕获。经常在执行完NSERT, UPDATE, 或 DELETE语句后,你需要立即测试@@ERROR值的变化。