PostgreSQL中未显式开启事务的多行语句是否为原子执行?
问题本质原因
这是PostgreSQL和你使用的Postico客户端的双重行为共同导致的结果:
PostgreSQL的隐式事务规则
默认自动提交模式下,如果服务端单次收到的请求中包含多条SQL语句,会自动将这整组语句包裹在一个隐式事务中执行,整组语句要么全部执行成功提交,要么任意一条出错全部回滚,不会出现部分成功的情况。
从你贴出的日志也可以验证:服务端记录的STATEMENT字段同时包含了两条insert语句,说明两条语句是作为同一个请求发送到服务端的。Postico的默认执行逻辑
Postico默认会将用户选中/输入的多条SQL语句作为一个单一请求发送给PostgreSQL服务端,而不是拆成单个语句逐句发送,所以触发了上述的隐式事务规则。
复现你预期的行为
如果你想要得到第一条insert执行成功、第二条因唯一约束失败的结果,只要调整执行方式即可:
- 分开单独执行两条
insert语句 - 在Postico的设置中开启逐句执行SQL的选项,让客户端将语句逐个发送给服务端
这种场景下单条语句会单独走自动提交逻辑,第一条执行成功后直接提交,第二条报错仅回滚第二条语句本身,最终表中会保留一条id=1的记录。
内容的提问来源于stack exchange,提问作者dmwong2268
相关产品推荐
相关产品推荐

