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(卖家,描述,拍卖日,开始价格,摘要);”
客户端没有机会捕获异常以进行回滚,也没有机会进行提交。
答案 0 :(得分:2)
最终,操作系统中的tcp keep alive机制将终止连接。当它发生时,数据库将回滚事务,因为它是没有显式提交的唯一可能选择。当连接处于活动状态且处于空闲状态时,您将锁定数据,并在pg_stat_activity表中显示“事务中空闲”的条目。通过与事务锁定的行的另一个连接进行的任何更新都将等待它提交/回滚。
默认tcp_keepalive超时为2小时,重试时间为几分钟。
答案 1 :(得分:1)
如果没有自动提交,那么如果DBMS没有提交,则值不会改变