PostgreSQL ODBC AutoCommit模式的实际含义及与原生事务的交互疑问
PostgreSQL ODBC autocommit=false事务行为疑问解答
核心结论
你示例中的update 4语句会被回滚,你给出的所有update语句最终都会被回滚。
底层交互逻辑说明
PostgreSQL服务端本身没有全局的autocommit开关,ODBC驱动的autocommit配置完全是驱动层的行为控制,不会向服务端发送全局修改类指令,具体行为规则如下:
- 当autocommit设为
false时,驱动会自动维护隐式事务:- 每次执行非事务控制语句(即不是
BEGIN/COMMIT/ROLLBACK等事务操作语句)前,若当前没有活跃事务,驱动会自动隐式向服务端发送BEGIN语句开启事务,这个过程对上层调用透明 - 当用户执行
COMMIT或ROLLBACK结束当前事务后,驱动不会自动提交后续语句,而是在下一次执行非事务控制语句时,再次自动隐式开启新的事务
- 每次执行非事务控制语句(即不是
- 这个逻辑和psql客户端中显式执行
BEGIN开启事务的模型唯一区别是:BEGIN语句是驱动自动下发的,不需要用户主动调用
示例执行流程拆解
你给出的代码实际执行时的完整交互如下:
-- autocommit = false in ODBC driver -- no explicit begin update 1; -> 驱动检测到无活跃事务,先隐式发BEGIN,再执行update 1 update 2; -> 直接在当前活跃事务中执行 rollback; -> 回滚当前事务,update 1、update 2均失效,事务结束 -- no begin update 4; -> 驱动检测到无活跃事务,隐式发新的BEGIN,再执行update 4 update 5; -> 直接在新的活跃事务中执行 rollback; -> 回滚当前新事务,update 4、update 5均失效
额外注意点
PostgreSQL本身不支持嵌套事务,如果你在autocommit=false的隐式事务已经开启的情况下,手动显式执行BEGIN语句,服务端会返回WARNING: there is already a transaction in progress,不会开启新事务,后续的一次COMMIT/ROLLBACK就会结束整个隐式事务,不会出现多层事务嵌套的情况。
内容的提问来源于stack exchange,提问作者Tuntable
相关产品推荐
相关产品推荐

