不支持所需的事务接口

时间:2012-10-08 17:33:59

标签: sql-server-2008 db2 linked-server

我在Sql Server 2008 R2和DB2之间创建了一个链接服务器。

我可以从查询窗口中选择和更新,但如果我尝试将更新包装在BEGIN TRANSACTION - COMMIT TRANSACTION中,我会收到以下错误:

无法执行请求的操作,因为OLE DB提供程序" DB2OLEDB"对于链接服务器" DB2"不支持所需的交易界面。

" DB2"是我的链接服务器的名称。

我尝试过使用四部分名称,例如

UPDATE [DB2].[TEST].[TEST].[TEST]
SET [COL2] = 2
WHERE [COL1] = 1

并使用OPENQUERY,例如

UPDATE OPENQUERY (DB2, 'SELECT [COL2] FROM TEST.TEST WHERE [COL1]=1)
SET [COL2]=2

如果我只是执行语句,它可以正常工作。如果我将它们包装在事务中则不会。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我已经对这个问题进行了更多的挖掘,答案如下: 功能部件包中的DB2OleDB提供程序不支持事务,但HIS(主机集成服务)支持事务。 此外,您必须使用DISTRIBUTED TRANSACTIONS并在调用BEGIN DISTRIBUTED TRANS之前设置XACT_ABORT。

一个例子:

SET XACT_ABORT ON
go
BEGIN DISTRIBUTED TRAN
Go
INSERT INTO OPENQUERY (SYS1_DUW, 
      'SELECT * from STROBAEK.DUWTEST') 
      (AREAID, AREADESC,REGIONID) 
      values ('11111', 'Redmond', 101)
ROLLBACK TRAN
Go

exec ('SELECT * FROM STROBAEK.DUWTEST') at SYS1_DUW
Go

AREAID                AREADESC          REGIONID
00001                 BadBoy            104
00002                 BadGirl           105


BEGIN DISTRIBUTED TRAN
Go
INSERT INTO OPENQUERY (SYS1_DUW, 
      'SELECT * from STROBAEK.DUWTEST') 
      (AREAID, AREADESC,REGIONID) 
      values ('11111', 'Bellevue', 101)
COMMIT TRAN
Go       

exec ('SELECT * FROM STROBAEK.DUWTEST') at SYS1_DUW
Go

AREAID                AREADESC          REGIONID
00001                 BadBoy            104
00002                 BadGirl           105
11111                 Bellevue          101


BEGIN DISTRIBUTED TRAN
Go
UPDATE OPENQUERY (SYS1_DUW, 
      'SELECT * from STROBAEK.DUWTEST') 
       set AREADESC = 'Copenhagen' where REGIONID = 101
COMMIT TRAN
Go

SET XACT_ABORT OFF

exec ('SELECT * FROM STROBAEK.DUWTEST') at SYS1_DUW

AREAID                AREADESC          REGIONID
00001                 BadBoy            104
00002                 BadGirl           105
11111                 Copenhagen        101

一个问题:DTC和Mirror无法一起使用

答案 1 :(得分:0)

我不相信Microsoft SQL Server数据库和IBM DB2数据库之间的链接服务器支持提交/回滚事务的能力。

如果您只发布一份不依赖于之前的陈述或工作组的陈述,这可能会也可能不会成为您试图做的事情的阻止。

是否存在特定问题(未通过您的问题透露)您试图通过将您的对帐单包装在事务块中来避免或解决?您可能必须以提交更改查询,检查查询成功,继续下一个查询的形式执行此操作。换句话说,“滚动你自己的”