--试试改为:
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

解决方案 »

  1.   

    TO:zjcxc(邹建) 
       谢谢你,我发的几个帖子都有你的参与。你这样改,实质不大。第一条Update语句肯定执行,当执行第二条UPDATE语句时,肯定失败,因此执行Rollback语句。SQLSERVER回滚了,但ORACLE似乎没有回滚,不然第二次执行时不会报错误:
    LE DB 提供程序 'MSDAORA' 报错。 
    [OLE/DB provider returned message: ORA-00060: 等待资源时检测到死锁]
    解决的办法,是不是有什么显示的语句要求ORACLE 回滚了?
      

  2.   

    你不说我倒忘了.问题出在这句上:SET XACT_ABORT ON用了这句后,一出错,事务就已经回滚了.去掉这句应该就没问题了.
      

  3.   

    --这个应该就可以了.
    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
      

  4.   

    编译不能通过,错误在“commit transaction”语句!
    你在线吗?我想和你讨论下
      

  5.   

    --在:--没注意,多了一个begin,这下应该没问题了.
    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
      

  6.   

    我对SQL SERVER不熟悉,但为了和ORACLE实时交换数据,也免为其难了。希望有朋友能帮下忙
      

  7.   

    上面的已经改好啦.我相反,对oracle不熟.呵呵
      

  8.   

    没有人可以帮我吗?
    http://www.dbforums.com/showthread.php?threadid=925213&highlight=BEGIN+DISTRIBUTED+TRANSACTION这篇文章好象可以解决问题,但我还未能消化。邹,帮忙看看?
      

  9.   

    试试,用你原来的,改:
    SET XACT_ABORT ON为:
    SET XACT_ABORT Off