2011-04-21 27 views
1
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(seller,description,auctiondays,startprice,summary);」

客戶端沒有機會捕捉異常回滾,也沒有機會做提交。

+0

如果答案幫助你,你應該接受它們。這是成本(非常昂貴...)要在該網站上發佈問題。 – 2011-04-21 18:38:53

回答

2

最終,保持TCP機制在OS將殺死連接改變。當它發生時,數據庫將回滾事務,因爲它是沒有顯式提交的唯一可能的選擇。當連接處於活動狀態並且處於空閒狀態時,您將鎖定數據並在pg_stat_activity表中指示「事務處於空閒狀態」。通過另一個連接更新您的事務鎖定的行將會等待它提交/回滾。

默認的tcp_keepalive超時時間爲2小時,重試時間爲幾分鐘。

+0

這是最糟糕的情況 - 如果整個客戶機失去連接並且不能恢復。但是,通常情況下,只有客戶端計算機上的進程終止並且操作系統立即重置連接。 – intgr 2011-04-22 14:54:35

1

如果沒有自動提交,則該值不會,如果DBMS不執行提交

+0

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/bmp4.html 頁面末尾顯示的示例具有顯式「提交」或「回滾」的邏輯。 但經過正確的操作,如果客戶端進程死亡會發生什麼 「AuctionItem AI = home.create(賣方, \t描述, \t auctiondays, \t startprice, \t摘要);」 – chen 2011-04-21 18:50:38

+0

但是當另一個進程試圖寫入與失敗進程相同的行時會發生什麼?第二個(新)過程是否得到完整性錯誤或允許順利航行? – 2014-02-24 08:24:27

相關問題