Sql Server下的数据库事务处理是相当的有用,笔者在项目的开发过程中由于事务处理没有编写好,导致了数据库数据出现了不一致。为了避免大家犯同样的错误,笔者在本文中用了三种不同方式,举例说明如何在存储过程事务处理中编写正确的代码。希望对你有所帮助。
在编写Sql Server的存储过程事务中,经常会遇到下面的程序
begin tran
inert into statement 1....
update statement 2......
......
commit tran
上面的编写的sql存在很大隐患。如下的例子:
create table demo(id varchar(32) not null)
go
begin tran
insert into demo values (null)
insert into demo values ('12345')
commit tran
执行时会出现一违反not null约束的错误信息,但随后又提示(1 row(s) affected)。然后执行select * from demo发现insert into demo values ('12345')执行成功。原因是sql server在发生runtime错误时,默认会rollback引起错误的语句,而继续执行后面的语句。
下面有三种方法避免上面错误的发生。
第一、在事务语句前加上set xact_abort on
set xact_abort on
begin tran
insert into statement1
insert into statement2
end tran
当exact_abort选项为on时,sql server在遇到错误时会终止执行并rollback整个事务
第二、在每条DML语句执行完后,立即判断状态,并做相应的处理
begin tran
insert into statement1
if @@error<>0
begin rollback tran
goto labend
end
insert into statement2
if @@error<>0
begin rollback tran
goto labend
end
commit tran
labend:
go
第三、在sql server2005中,可以利用try ...catch异常处理机制
begin tran
begin try
insert into statement1......
insert into statement2......
end try
begin catch
if @@trancount>0
rollback tran
end catch
if @@trancount>0
commit tran
end