1

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

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

无法执行请求的操作,因为链接服务器“DB2”的 OLE 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

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

任何帮助,将不胜感激。

4

1 回答 1

2

我对这个问题做了更多的研究,答案如下:特性包中的 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 和 Mirror 不能一起工作

于 2012-10-10T06:51:05.613 回答