“transaction interface” error when updating table on linked server

孤者浪人 提交于 2020-01-15 11:05:12

问题


I'm getting this error when trying to update a db2 database that is a linked server on our SQL Server db.

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)')

I am connecting to sql server via pyodbc and can run sql scripts with no issues. Here is the sql I get the error with

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()

And just in case here is my connection string using 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()

Also note that this query runs just fine in SSMS. I have also tried the openquery method but had no luck. Any ideas?


回答1:


Python's DB API 2.0 specifies that, by default, connections should open with autocommit "off". This results in all database operations being performed in a transaction that must be explicitly committed (or rolled back) in the Python code.

When a pyodbc connection with autocommit = False (the default) sends an UPDATE to the SQL Server, that UPDATE is enclosed in a Local Transaction managed by SQL Server. When the SQL Server determines that the target table is on a Linked Server it tries to promote the transaction to a Distributed Transaction managed by MSDTC. If the connection technology used to manage the Linked Server does not support Distributed Transactions then the operation will fail.

This issue can often be avoided by ensuring that the pyodbc connection has autocommit enabled, either by

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

or

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

That will send each SQL statement individually, without being wrapped in an implicit transaction.



来源:https://stackoverflow.com/questions/47288391/transaction-interface-error-when-updating-table-on-linked-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!