事務的定義,事務的作用以及Spring事務原理

首先,說說什麼事務
(Transaction)。
事務,就是一組操作數據庫的動作集合。
事務是現代數據庫理論中的核心概念之一。如果一組處理步驟或者全部發生或者一步也不執行,我們稱該組處理步驟爲一個事務。當所有的步驟像一個操作一樣被完整地執行,我們稱該事務被提交。由於其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。

事物的基本特徵:

  • 事務是併發控制的單位,是用戶定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。通過事務,SQL Server能將邏輯相關的一組操作綁定在一起,以便服務器保持數據的完整性。
  • 事務通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。
  • COMMIT表示提交,即提交事務的所有操作。具體地說就是將事務中所有對數據庫的更新寫回到磁盤上的物理數據庫中去,事務正常結束。
  • ROLLBACK表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。
事務運行的三種模式:
  • 自動提交事務:每條單獨的語句都是一個事務。每個語句後都隱含一個COMMIT。
  • 顯式事務: 以BEGIN TRANSACTION顯式開始,以COMMIT或ROLLBACK顯式結束。
  • 隱性事務 :在前一個事務完成時,新事務隱式啓動,但每個事務仍以COMMIT或ROLLBACK顯式結束。
事務的特性(ACID特性)
  • 原子性(Atomicity) 事務是數據庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
  • 一致性(Consistency)事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  • 隔離性(Isolation)一個事務的執行不能被其他事務干擾。
  • 持續性/永久性(Durability)一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
注:事務是恢復和併發控制的基本單位。

Spring事務原理

Spring事務策略,也就是spring事務管理的實現方式.它有一個統一的抽象是由實現下面這個接口完成的.org.springframework.transaction.PlatformTransactionManager
此接口的內容如下:

Public interface PlatformTransactionManager()...{  
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;  
Void commit(TransactionStatus status) throws TransactionException;  
Void rollback(TransactionStatus status) throws TransactionException;  
不管是聲明式的還是編程式的事務管理都需要此抽象來完成.解釋一下這個接口,這樣可以更好的理解spring的事務控制的原理.getTransaction() 根據類型爲TransactionDefinition的參數返回一個TransactionStatus對象.返回的 TransactionStatus對象可能代表一個新的或已經存在的事務(如果在當前調用堆棧有一個符合條件的事務).如同J2EE事務上下文,一個 TransactionStatus也是和執行的線程關聯的.同時,在框架中還存在TransactionDefinition接口,即上邊的參數類型.此接口指定了事務隔離程度、事務傳播、事務超時、只讀狀態。
另外,還有TransactionStatus接口。這個接口爲處理事務提供簡單的控制事務執行和查詢事務狀態的方法。

統觀spring事務,圍繞着兩個核心PlatformTransactionManager和TransactionStatus 

spring提供了幾個關於事務處理的類: 
  • TransactionDefinition //事務屬性定義
  • TranscationStatus //代表了當前的事務,可以提交,回滾。
PlatformTransactionManager這個是spring提供的用於管理事務的基礎接口,其下有一個實現的抽象類AbstractPlatformTransactionManager,我們使用的事務管理類例如DataSourceTransactionManager等都是這個類的子類。

一般事務定義步驟:

TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{ //do sth
transactionManager.commit(ts);
}
catch(Exception e){
transactionManager.rollback(ts);
}

spring提供的事務管理可以分爲兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重複的代碼比較多;聲明式的比編程式的更靈活。

(1)編程式主要使用transactionTemplate。省略了部分的提交,回滾,一系列的事務對象定義,需注入事務管理對象.

void add()
{
    transactionTemplate.execute( new TransactionCallback(){
        public Object doInTransaction(TransactionStatus ts)
       { //do sth}
    }
}

(2)聲明式:使用TransactionProxyFactoryBean:
<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
   <property name="transactionManager"><ref bean="transactionManager"/></property>
   <property name="target"><ref local="userManagerTarget"/></property>
   <property name="transactionAttributes">
    <props>
     <prop key="insert*">PROPAGATION_REQUIRED</prop>
     <prop key="update*">PROPAGATION_REQUIRED</prop>
     <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
   </property>
</bean>

圍繞Poxy的動態代理,能夠自動的提交和回滾事務
org.springframework.transaction.interceptor.TransactionProxyFactoryBean

  • PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  • PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
  • PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
  • PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
  • PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
  • PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
  • PROPAGATION_NESTED--如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章