如果客户端死亡,我们应该期待什么交易行为?

时间:2011-04-21 18:17:14

标签: database postgresql

BEGIN;

UPDATE saving SET balance = balance - 100.00 WHERE name = 'Alice';

UPDATE checking SET balance = balance + 100.00 WHERE name = 'Alice';

COMMIT

在此事务期间,我的客户端在提交之前死亡。我期望DB的状态是什么?

让我用一个具体的例子 http://java.sun.com/developer/onlineTraining/Programming/JDCBook/bmp4.html

页面末尾显示的示例具有明确的“提交”或“回滚”逻辑。但是如果客户端进程在操作后立即死亡会发生什么:

“AuctionItem ai = home.create(卖家,描述,拍卖日,开始价格,摘要);”

客户端没有机会捕获异常以进行回滚,也没有机会进行提交。

2 个答案:

答案 0 :(得分:2)

最终,操作系统中的tcp keep alive机制将终止连接。当它发生时,数据库将回滚事务,因为它是没有显式提交的唯一可能选择。当连接处于活动状态且处于空闲状态时,您将锁定数据,并在pg_stat_activity表中显示“事务中空闲”的条目。通过与事务锁定的行的另一个连接进行的任何更新都将等待它提交/回滚。

默认tcp_keepalive超时为2小时,重试时间为几分钟。

答案 1 :(得分:1)

如果没有自动提交,那么如果DBMS没有提交,则值不会改变