日期:2014-05-17  浏览次数:20509 次

一个事物控制的小问题
BEGIN TRANSACTION
insert table1--这一句OK
insert table2--执行这一句出错
IF @@ERROR>0
BEGIN
ROLLBACK
END
ELSE
COMMIT

我希望是insert table2出错的话,把insert table1也回滚回去,请问下怎么修改上面的事物控制语句呢?

------解决方案--------------------
这么写好像能达到你的要求
------解决方案--------------------
引用:
Plain Text code?123456789BEGIN TRANSACTIONinsert table1--这一句OKinsert table2--执行这一句出错IF @@ERROR>0BEGINROLLBACKENDELSE    COMMIT
我希望是insert table2出错的话,把insert table1也回滚回去,请问下怎么修改上面的事物控制语句呢……



create TABLE tb1 (id INT,col VARCHAR)
create TABLE tb2 (id INT,col2 VARCHAR)

BEGIN TRANSACTION
insert INTO tb1(id,col) SELECT 1,'a'
insert INTO tb2(id,col2) SELECT 'b',3
IF @@ERROR>0
BEGIN
ROLLBACK
END
ELSE   
COMMIT



SELECT * FROM tb1
SELECT * FROM tb2 




lz写的这个就OK哦。
------解决方案--------------------
引用:
锁定问题点了,原来是虽然出错,但@@ERROR仍然等于0,在查询分析器里的报错是“不能在具有唯一索引 'ix_sodetail_isosid' 的对象 'dbo.so_sodetails' 中插入重复键的行。”,难道这个错误不能让@@ERROR>0吗?if条件改怎样写才能抓到错误呢?



改用try ...catch...

具体语法查看联机丛书
------解决方案--------------------
自05以后,添加了try catch语句,比@@error更灵活,更方便
@@error这个我一直觉得与事务一起,起的作用不大,因为如果一旦错误的级别高了,会引起进程中断,中断后,后面的语句都执行不了了
而try catch可以有效防止一些高级别的错误中断