2012-10-08 47 views
1

我在Sql Server 2008 R2和DB2之间创建了一个链接服务器。不支持所需的交易接口

我可以做从查询的Windows选择和更新,但如果我尝试换我更新的BEGIN TRANSACTION - COMMIT TRANSACTION我收到以下错误:

请求的操作不能因为OLE执行链接服务器“DB2”的DB提供程序“DB2OLEDB”不支持所需的事务接口。

“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 

如果我只是执行语句它工作正常。如果我把它们包装在一个交易中,它不会。

任何帮助,将不胜感激。

回答

0

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

如果您只发布一条不依赖于之前的陈述或工作组的单独陈述,这可能会或可能不会成为您正在尝试做的事情的阻碍。

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

+0

工作上面的查询主要是用来说明我的问题。实际的查询是作为更大集合(从代码执行)的一部分运行的一部分。 –

1

我已经做了一些更深入的研究,问题的答案如下: 功能包中的DB2OleDB提供程序不支持事务,但HIS(主机集成服务)的确如此。 您还必须在调用BEGIN DISTRIBUTED TRANS之前使用DISTRIBUTED TRANSACTIONS并设置XACT_ABORT ON。

一个例子:

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和镜子不在一起