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也會自動回滾。