使用Robot Framework操作Sybase时遇SET CHAINED命令错误求助
解决Sybase ASE中SET CHAINED命令不能在多语句事务内执行的问题
我之前也碰到过类似的问题,用Robot Framework+pyodbc连接Sybase ASE执行写操作时触发了这个226错误,本质原因是SET CHAINED命令无法在已经启动的事务上下文里执行——而pyodbc或者DatabaseLibrary可能在连接建立后自动开启了隐式事务,或者之前的操作没有正确提交/回滚,导致后续执行相关命令时已经处于事务中。
下面是几个亲测有效的解决方案:
1. 在连接字符串中直接指定事务模式(最推荐)
Sybase ASE的ODBC驱动支持通过连接参数Chained直接设置事务模式,这样就不需要在连接后再执行SET CHAINED命令,从根源避免冲突。
修改你的连接语句,加入Chained=0(非链式事务,即自动提交模式)或者Chained=1(链式事务,需显式提交/回滚):
connect To Database Using Custom Params pyodbc "Driver={Adaptive Server Enterprise}; server=<myserver>; port=<myport>;db=<mydb>;uid=<myuser>; pwd=<mypasswd>;Chained=0;"
如果你的业务需要链式事务(比如多个操作要原子执行),就设为Chained=1,但记得执行完后显式提交或回滚。
2. 显式管理事务边界
如果不想修改连接参数,可以在执行DELETE/UPDATE这类写操作前,确保没有未结束的事务:
# 先提交或回滚之前的事务,清空上下文 Rollback Transaction # 执行写操作 Execute Sql DELETE FROM TABLE WHERE FIELD1 = '1000' # 链式模式下必须显式提交 Commit Transaction
这样能保证执行写操作时处于一个干净的事务上下文,不会触发SET CHAINED的冲突。
3. 开启DatabaseLibrary的自动提交
有些版本的Robot Framework DatabaseLibrary默认关闭了自动提交,导致执行写操作后事务一直处于开启状态。你可以在连接后开启自动提交:
connect To Database Using Custom Params pyodbc "Driver={Adaptive Server Enterprise}; server=<myserver>; port=<myport>;db=<mydb>;uid=<myuser>; pwd=<mypasswd>;" Set Auto Commit On
开启自动提交后,每个写操作都会自动提交,不会留下未结束的事务,也就不会触发SET CHAINED的问题。
内容的提问来源于stack exchange,提问作者Bahubali Patil
相关产品推荐
相关产品推荐

