【问题标题】:"transaction interface" error when updating table on linked server更新链接服务器上的表时出现“事务接口”错误
【发布时间】:2017-11-14 14:37:00
【问题描述】:

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

ERROR:root:('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]无法执行请求的操作,因为链接服务器“iSeries”的 OLE DB 提供程序“IBMDA400”确实不支持所需的事务接口。(7390) (SQLExecDirectW)')

我正在通过 pyodbc 连接到 sql server,并且可以毫无问题地运行 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 方法,但没有运气。有什么想法吗?

【问题讨论】:

  • 嗨,你见过Bobby Tables 吗?
  • @alfasin 这是一个没有输入的自动化过程。
  • 哦,那样的话写马虎的代码也没关系……
  • 尝试在调用pyodbc.connect 后立即添加conn.autocommit = True 语句。
  • @GordThompson 成功了!那么.execute之后的commit语句不起作用,因为链接服务器想要在返回python之前提交更改?这听起来像一个准确的说法吗?

标签: python sql-server python-3.x pyodbc


【解决方案1】:

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

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

通常可以通过确保 pyodbc 连接启用自动提交来避免此问题,或者通过

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

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

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

【讨论】:

  • 感谢您的详细解释。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多