postgresql 如果没有收到来自数据库的对提交的响应,会发生什么?

9q78igpj  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(126)

如果我有一个@Transaction方法(默认隔离级别),并且最终它将commit发送到DB,DB会将事务设置为对其他事务可见,并将响应发送回我,但网络滞后,我收到超时消息。会发生什么事呢?是否将回滚事务处理?

prdp8dxp

prdp8dxp1#

如果COMMIT语句超时,则客户端无法确定事务是否已提交。它可能已成功提交,但在向客户端发送响应时网络中断,或者COMMIT语句可能已被超时取消。
如果您担心这一点,您可以在交易进行时获取交易ID:

SELECT pg_current_xact_id();

字符串
然后,超时后,你就可以跑了

SELECT pg_xact_status(123456);


查看该事务是否已提交(用第一次查询的结果替换123456)。
在大多数情况下,COMMIT是一个非常快的操作,没有问题,它不应该给你带来麻烦。

z3yyvxxp

z3yyvxxp2#

通常,当您向数据库发送请求时,事务将启动。在此期间,在事务内所做的更改在提交或回滚之前对其他事务不可见。
如果存在网络问题,则事务可能在数据库侧保持在打开状态。它最终将由于不活动或达到超时限制而关闭连接。连接关闭后,事务将自动回滚。

biswetbf

biswetbf3#

基于Spring Framework的Chapter 17. Transaction management,一般来说,如果事务超时,它将被回滚。
在使用Spring与PostgreSQL数据库的情况下,当使用带有超时参数的@Transactional注解时,如果数据库操作花费的时间超过指定的超时时间,则会抛出TransactionTimedOutException,并回滚事务。
查看原始问题下的注解后,如果数据库收到提交,但客户端由于网络问题没有收到响应,则事务仍将在数据库端提交。客户端可能会收到超时错误,但事务将已成功提交到数据库上
我还推荐这个article,因为它深入研究了超时是如何工作的。

相关问题