我在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
如果我只是执行语句,它可以正常工作。如果我将它们包装在事务中则不会。
任何帮助都将不胜感激。
答案 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数据库之间的链接服务器支持提交/回滚事务的能力。
如果您只发布一份不依赖于之前的陈述或工作组的陈述,这可能会也可能不会成为您试图做的事情的阻止。
是否存在特定问题(未通过您的问题透露)您试图通过将您的对帐单包装在事务块中来避免或解决?您可能必须以提交更改查询,检查查询成功,继续下一个查询的形式执行此操作。换句话说,“滚动你自己的”。