IBM Informix 11.7执行查询时提示‘Not in transaction’错误求助
我之前帮几个同行排查过一模一样的问题,确实挺让人挠头的——明明代码里确认连接状态是OPEN,执行查询时却突然抛出ERROR [HY000] [Informix .NET provider][Informix]Not in transaction。结合实际排查经验,给你列几个最常见的解决方向:
检查操作是否需要显式事务上下文
Informix的部分操作(比如某些DDL语句、使用WITH HOLD定义的游标)会隐式要求处于事务中。如果你的查询刚好属于这类场景,哪怕连接是打开的,没有先开启事务就会触发这个错误。可以试试在执行目标查询前,显式调用BEGIN TRANSACTION,执行完成后再根据结果COMMIT或ROLLBACK。排查连接池的隐性状态问题
要是你用了连接池,有时候从池里获取的连接可能残留着之前的事务状态——比如上一个使用者没正确提交/回滚就释放了连接。这种情况下,连接的State虽然显示OPEN,但内部的事务上下文已经混乱。可以先临时关闭连接池测试(在连接字符串里添加Pooling=false),如果问题消失,那就要优化你的连接释放逻辑,确保每次用完连接都清理掉未完成的事务。验证.NET Provider版本兼容性
老版本的Informix .NET Provider和11.7版本的数据库之间,可能存在事务处理逻辑的兼容性bug。建议升级到适配Informix 11.7的最新Provider版本(比如IBM Data Server Provider for .NET对应Informix的分支版本),很多时候这类诡异的错误就是版本不匹配导致的。确认连接状态的真实性
有时候代码里判断的Connection.State == ConnectionState.Open可能存在滞后,或者连接已经被数据库端因为超时、资源回收等原因悄悄关闭,但客户端还没同步感知到。可以在执行查询前再做一次连接状态校验,必要时重新打开连接,同时检查数据库的IDLE_TIMEOUT等连接超时配置,看是不是连接被提前回收了。简化SQL定位问题点
复杂的SQL组合(比如嵌套游标、批量操作)可能触发Informix的事务检测逻辑异常。可以先执行一个最简单的测试语句,比如SELECT 1 FROM systables,如果这个简单语句没问题,再逐步还原你的复杂查询,定位到具体是哪部分语句导致的错误。
内容的提问来源于stack exchange,提问作者Delwin Andrews

