"transaction interface" 在链接服务器上更新 table 时出错

"transaction interface" error when updating table on linked server

我在尝试更新作为我们 SQL 服务器数据库上的链接服务器的 db2 数据库时遇到此错误。

ERROR:root:('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The requested operation could not be performed because OLE DB provider "IBMDA400" for linked server "iSeries" does not support the required transaction interface. (7390) (SQLExecDirectW)')

我正在通过 pyodbc 连接到 sql 服务器并且可以 运行 sql 脚本没有问题。这是 sql 我得到

的错误
sql3 = " exec ('UPDATE SVCEN2DEV.SRVMAST SET SVRMVD = ? WHERE svtype != ''*DCS-'' AND svcid = ? and svacct = ? ') AT [iSeries]"
db.execute(sql3, (row[2],srvid,row[0]))
db.commit()

为了以防万一,这是我使用 pyodbc 的连接字符串:

conn = pyodbc.connect("DRIVER={SQL Server};SERVER="+ Config_Main.dbServer +";DATABASE="+ Config_Main.encludeName +";UID="+ Config_Main.encludeUser +";PWD=" + Config_Main.encludePass)
db = conn.cursor()

另请注意,此查询 运行 在 SSMS 中运行良好。我也尝试过 openquery 方法,但没有成功。有什么想法吗?

Python 的 DB API 2.0 指定,默认情况下,连接应使用自动提交 "off" 打开。这导致在必须在 Python 代码中显式提交(或回滚)的事务中执行所有数据库操作。

当与 autocommit = False(默认)的 pyodbc 连接向 SQL 服务器发送更新时,该更新包含在由 SQL 服务器管理的本地事务中。当 SQL 服务器确定目标 table 在链接服务器上时,它会尝试将该事务提升为由 MSDTC 管理的分布式事务。如果用于管理链接服务器的连接技术不支持分布式事务,则操作将失败。

这个问题通常可以通过确保 pyodbc 连接启用自动提交来避免,方法是

cnxn = pyodbc.connect(conn_str, autocommit=True)

cnxn = pyodbc.connect(conn_str)
cnxn.autocommit = True

这将单独发送每个 SQL 语句,而不包含在隐式事务中。