【发布时间】:2019-09-06 01:07:24
【问题描述】:
使用 pyodbc 我正在更新三个数据库表。更新最后一个表时遇到错误,我正在调用 rollback() 函数。即使在 rollback() 上,第二个表也会保留其更新的值;第一个和第三个表没有按预期更新。为什么它会这样?
dbCursor.execute("insert into table1(item11, item12, item13, item14, item15, item16) values(?,?,?,?,?,?)", value1, value2, value3, value4, value5, value6)
dbCursor.execute("update into table2(item21, item22, item23, item24, item25, item26) values(?,?,?,?,?,?)", value1, value2, value3, value4, value5, value6)
---> two rows in the table get updated
dbCursor.execute("select item from table2 where unit_no = ?", unit_number)
tempVal = dbCursor.fetchone()
dbCursor.execute("update table3 set item31=?, item32=? where unit=?", val1, val2, tempVal)
---> Nothing gets updated as there is no tempVal found
if dbCursor.rowcount is 0:
dbCursor.rollback()
预计rollback()会导致三个表都回滚,但是table2保留了值。
connection.getinfo(pyodbc.SQL_DRIVER_NAME) --> iclit09b.dll
connection.getinfo(pyodbc.SQL_DRIVER_VER) --> 4.10.FC4DE
【问题讨论】:
-
请edit您的问题包含
connection.getinfo(pyodbc.SQL_DRIVER_NAME)和connection.getinfo(pyodbc.SQL_DRIVER_VER)返回的值 -
Informix 数据库是否支持事务?您的连接是否关闭了自动提交?
-
大概你的意思是
insert into table2而不是update into table2?该语法适用于 INSERT 语句,但您使用的是update而不是insert。 -
您在 INSERT 语句中有匿名列
itemNN;您使用以前未识别的unit_number进行选择。这些是如何联系在一起的?为什么新数据要与单元号匹配? -
可能 AutoCommit 设置为 true,这意味着您执行的每个 .execute 都会被提交。尝试在第一个 .execute 之前设置“autocommit(conn, 0)”。或在连接字符串中将其设置为关闭。更多信息在这里:github.com/mkleehammer/pyodbc/wiki/Connection