1. 程式人生 > >Spring 事務——事務介紹以及事務在Spring框架中的基本實現

Spring 事務——事務介紹以及事務在Spring框架中的基本實現

事務介紹

事務一般發生在和持久層打交道的地方,比如資料庫。
假設一個工作由兩件事共同組成,那麼這兩件事要麼全部完成,這個工作才算完成。要麼全部回退到初始狀態。不存在只完成一件,還有一件事沒完成的。這項工作可稱為一個事務。常用的場景就是銀行轉賬。A向B轉賬100元這項工作由兩件事組成:A帳戶減100元,B賬戶加100元。這兩件事要麼同時完成,要麼同時都回退到初始狀態。如果只完成其中一件,另一件沒完成,那就出岔子了。。

事務四大特性:ACID

原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。

一致性(Consistency)

:一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的資料不應該被破壞。

隔離性(Isolation):可能有許多事務會同時處理相同的資料,因此每個事務都應該與其他事務隔離開來,防止資料損壞。

永續性(Durability):一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化儲存器中。

Spring事務支援

Spring可以使用程式設計式事務,也可以使用宣告式事務。不過一般用的多的是用宣告式。

Spring使用AOP生成一個代理物件來支援宣告式事務,使得我們無需要去處理獲得連線、關閉連線、事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理大量的try…catch…finally程式碼。

比如,我們聲明瞭一個事務方法methodTest()

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void methodTest() {
// do something
}

當呼叫

main{  
    methodTest();
} 

相當於執行(只是舉個例子,虛擬碼。不同的事務管理器內部實現都不同)

Main{ 
	Connection con=null; 
	try{ 
	    con = getConnection(); 
	    con.setAutoCommit(false); 
	    //方法呼叫
	    methodTest(); 
	    //提交事務
	    con.commit(); 
	} 
	Catch(RuntimeException ex){ 
	    //回滾事務
	    con.rollback();   
	} 
	finally{ 
	    //釋放資源
	    closeCon(); 
	} 
}