Error de “interfaz de transacción” al actualizar la tabla en el servidor vinculado

Recibo este error al intentar actualizar una base de datos db2 que es un servidor vinculado en nuestra base de datos de SQL Server.

ERROR: raíz 🙁 ‘42000’, ‘[42000] [Microsoft] [Controlador ODBC para SQL Server] [Servidor SQL] La operación solicitada no se pudo realizar porque el proveedor OLE DB “IBMDA400” para el servidor vinculado “iSeries” no admite la interfaz de transacción requerida. (7390) (SQLExecDirectW) ‘)

Me estoy conectando al servidor de SQL a través de pyodbc y puedo ejecutar scripts de SQL sin problemas. Aquí está el sql me sale el error con

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

Y por si acaso aquí está mi cadena de conexión usando 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() 

También tenga en cuenta que esta consulta se ejecuta bien en SSMS. También he probado el método de openquery pero no tuve suerte. ¿Algunas ideas?

DB API 2.0 de Python especifica que, de forma predeterminada, las conexiones deben abrirse con la confirmación automática “desactivada”. Esto hace que todas las operaciones de la base de datos se realicen en una transacción que se debe confirmar explícitamente (o revertir) en el código de Python.

Cuando una conexión pyodbc con autocommit = False (el valor predeterminado) envía una ACTUALIZACIÓN a SQL Server, dicha ACTUALIZACIÓN se incluye en una Transacción local administrada por SQL Server. Cuando el servidor SQL determina que la tabla de destino está en un servidor vinculado, intenta promover la transacción a una transacción distribuida administrada por MSDTC . Si la tecnología de conexión utilizada para administrar el servidor vinculado no admite transacciones distribuidas, la operación fallará.

Este problema a menudo puede evitarse asegurándose de que la conexión pyodbc tenga habilitada la confirmación automática, ya sea por

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

o

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

Eso enviará cada statement SQL individualmente, sin ser envuelto en una transacción implícita.