第一个问题:
begin tran
Exec OneProduce
......
if @@error<>0
begin
Rollback tran
return
end
commit tran
不知如果存储过程中OneProduce出现错误,是否会导致Rollback?是否Rollback在OneProduce中所执行的程序?
第二个问题:
begin tran
Insert into OneTable (field1) values ('a')
..........
if @@error<>0
begin
Rollback tran
return
end
commit tran
假如OneTable中有一个Insert触发器,如果出现错误,那么Rollback是否Rollack触发器中所做的工作?
回答:
ROLLBACK TRANSACTION
(微軟的定義:)將外顯或隱含的交易復原至交易的開頭,或復原至交易中的安全點。
所以 嵌套 或 觸發 的交易應該算是 "隱含"的交易
---------------------------------------------------------------
1。这种错误检测方式是有问题的,因为@@error返回的是最后的 Transact-SQL 语句执行情况,每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
所以如果即使OneProduce执行过程中有错误,如果在之后有其他语句正确执行,@@error变成0,将无法检测出错误。
另外,存储过程OneProduce中最好也要有错误检测代码,执行结果通过return返回,在存储过程之后紧接着进行判断,错误就回滚,这样应该会更好些。
记住一点:在 Transact-SQL 语句后,马上检测或使用 @@ERROR。或者在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
2。longj(龙九)说得没错,事务之间所有的操作都会被回滚,包括触发器的操作。