1. 程式人生 > >spring事務管理(暫定)

spring事務管理(暫定)

spring事務管理
事務有四大特性(ACID)


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


2.一致性(Consistency)事務在完成時,必須是所有的資料都保持一致狀態。


3.隔離性(Isolation)併發事務執行之間無影響,在一個事務內部的操作對其他事務是不產生影響,這需要事務隔離級別來指定隔離性。


4.永續性(Durability)一旦事務完成,資料庫的改變必須是持久化的。
事務併發所可能存在的問題: 

1.髒讀:一個事務讀到另一個事務未提交的更新資料。
 
2.不可重複讀:一個事務兩次讀同一行資料,可是這兩次讀到的資料不一樣。 

3.幻讀:一個事務執行兩次查詢,但第二次查詢比第一次查詢多出了一些資料行。 

4.丟失更新:撤消一個事務時,把其它事務已提交的更新的資料覆蓋了。

實現事務管理可以分為兩種方式:
1.程式設計式事務管理:
TransactionTemplate 的execute 方法接收一個TransactionCallback 例項。Callback 也是Spring 的經典設計,用於簡化使用者操作, TransactionCallback 包含如下方法。 
(一)Object dolnTransaction(TransactionStatus status) 。 該方法的方法體就是事務的執行體。 

transactionTemplate.execute(new TransactionCallback() { 
    public Object doInTransaction(TransactionStatus status) { 
        try{ 
            } 
        catch (Exception e) { 
            status.setRollbackOnly(); 
        } 
        finally { 
               }
    }}
); 
(二)如果事務的執行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的例項。這是個抽象類,不能直接例項化,只能用於建立匿名內部類。它也是TransactionCallback 介面的子介面,該抽象類包含一個抽象方法: 
void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區別在於該方法沒有返回值,即事務執行體無須返回值。 

2.宣告式事務管理
兩種方式:1.基於tx和aop名稱空間的xml配置檔案 
                  2.基於註解,這種方式最簡單,也是最為常用的,只需要在配置檔案中開啟對註解事務管理的支援。
 <!-- 宣告式事務管理 配置事物的註解方式注入-->
<tx:annotation-driven transaction-manager="transactionManager"/>

然後在需要事務管理的地方加上@Transactional註解,如:
@Transactional(rollbackFor=Exception.class)
   
 public void insert(String sql, boolean flag) throws Exception {
       
     dao.insertSql(sql);
        // 如果flag 為 true ,丟擲異常
       
     if (flag){
            
        throw new Exception("has exception!!!");
     
   }
    }
rollbackFor屬性指定出現Exception異常的時候回滾,遇到檢查性的異常需要回滾,預設情況下非檢查性異常,包括error也會自動回滾。