--试试改为:
ALTER PROCEDURE TEST
AS
SET XACT_ABORT ONBEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
if @@error <>0 goto lb_err--SQLSERVER表操作
--将超过ENAME字段长度的内容付给它,引起错误。测试事物是否完整。
UPDATE A..EMP SET ENAME='SmithSmithSmith' WHERE EMPNO='7369'
if @@error <>0 goto lb_errcommit transaction
return 0--成功
lb_err:
rollback transaction
return -1--失败
go
ALTER PROCEDURE TEST
AS
SET XACT_ABORT ONBEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
if @@error <>0 goto lb_err--SQLSERVER表操作
--将超过ENAME字段长度的内容付给它,引起错误。测试事物是否完整。
UPDATE A..EMP SET ENAME='SmithSmithSmith' WHERE EMPNO='7369'
if @@error <>0 goto lb_errcommit transaction
return 0--成功
lb_err:
rollback transaction
return -1--失败
go
谢谢你,我发的几个帖子都有你的参与。你这样改,实质不大。第一条Update语句肯定执行,当执行第二条UPDATE语句时,肯定失败,因此执行Rollback语句。SQLSERVER回滚了,但ORACLE似乎没有回滚,不然第二次执行时不会报错误:
LE DB 提供程序 'MSDAORA' 报错。
[OLE/DB provider returned message: ORA-00060: 等待资源时检测到死锁]
解决的办法,是不是有什么显示的语句要求ORACLE 回滚了?
ALTER PROCEDURE TEST
AS
BEGIN
SET XACT_ABORT ON declare @errors int
select @errors=-1 BEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
--SQLSERVER表操作
--将超过ENAME字段长度的内容付给它,引起错误。测试事物是否完整。
UPDATE A..EMP SET ENAME='SmithSmithSmith' WHERE EMPNO='7369' commit transaction
go
你在线吗?我想和你讨论下
ALTER PROCEDURE TEST
AS
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
--ORACLE 表更新操作
UPDATE LinkOraDB..SCOTT.EMP SET ENAME='Smith' WHERE EMPNO='7369'
--SQLSERVER表操作
--将超过ENAME字段长度的内容付给它,引起错误。测试事物是否完整。
UPDATE A..EMP SET ENAME='SmithSmithSmith' WHERE EMPNO='7369' commit TRANSACTION
go
http://www.dbforums.com/showthread.php?threadid=925213&highlight=BEGIN+DISTRIBUTED+TRANSACTION这篇文章好象可以解决问题,但我还未能消化。邹,帮忙看看?
SET XACT_ABORT ON为:
SET XACT_ABORT Off