请教:有关SQL的事务处理
第一个问题:
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触发器中所做的工作?
问题点数:60、回复次数:6Top
1 楼kaikaihe(开开)回复于 2002-04-18 08:19:50 得分 0
只有程序出错才会导致@@error<>0,此时程序直接返回调用处,所以不可能进行if @@error <> 0的判断Top
2 楼longj(大哥雁)回复于 2002-04-18 08:29:12 得分 20
ROLLBACK TRANSACTION
(微軟的定義:)將外顯或隱含的交易復原至交易的開頭,或復原至交易中的安全點。
所以 嵌套 或 觸發 的交易應該算是 "隱含"的交易
Top
3 楼longj(大哥雁)回复于 2002-04-18 08:31:56 得分 0
此外,樓上的不對吧
@@ERROR
傳回上次執行 Transact-SQL 陳述式時的錯誤代碼。
當然,可以抓到錯誤,msdn都有這樣的例子Top
4 楼bluepower2008(蓝色力量)回复于 2002-04-18 10:34:51 得分 40
1。这种错误检测方式是有问题的,因为@@error返回的是最后的 Transact-SQL 语句执行情况,每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
所以如果即使OneProduce执行过程中有错误,如果在之后有其他语句正确执行,@@error变成0,将无法检测出错误。
另外,存储过程OneProduce中最好也要有错误检测代码,执行结果通过return返回,在存储过程之后紧接着进行判断,错误就回滚,这样应该会更好些。
记住一点:在 Transact-SQL 语句后,马上检测或使用 @@ERROR。或者在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。
2。longj(龙九)说得没错,事务之间所有的操作都会被回滚,包括触发器的操作。Top
5 楼vicentyan(菜鸟)回复于 2002-04-18 22:12:05 得分 0
明白!谢谢各位大侠!Top
6 楼vicentyan(菜鸟)回复于 2002-04-18 22:17:33 得分 0
怎么无法给分?Top




