spring transaction 筆記
事務(wù)的特性(ACID)
原子性(Atomicity)鄙陡、一致性(Consistency)渊涝、隔離性(Isolation囤锉,又稱獨立性)丈莺、持久性(Durability)。
原子性:一整個交易中的所有操作拐迁,要么全部完成蹭劈,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)线召。交易在執(zhí)行過程中發(fā)生錯誤铺韧,會被回復(fù)(Rollback)到交易開始前的狀態(tài),就像這個交易從來沒有執(zhí)行過一樣缓淹。
一致性:在交易開始之前和交易結(jié)束以后祟蚀,數(shù)據(jù)庫的完整性限制沒有被破壞。
隔離性:兩個交易的執(zhí)行是互不干擾的割卖,一個交易不可能看到其他交易運行時前酿,中間某一時刻的數(shù)據(jù)。
持久性:在交易完成以后鹏溯,該交易對數(shù)據(jù)庫所作的更改便持久地保存在數(shù)據(jù)庫之中罢维,并不會被回復(fù)。
spring的事務(wù)API
PlatformTransactionManager
PlatformTransactionManager(平臺事務(wù)管理器),用于事務(wù)管理的一組API
spring提供的幾組實現(xiàn)
- DataSourceTransactionManager:適用于使用JDBC和iBatis進行數(shù)據(jù)持久化操作的情況肺孵。
- HibernateTransactionManager:適用于使用Hibernate進行數(shù)據(jù)持久化操作的情況匀借。
- JpaTransactionManager:適用于使用JPA進行數(shù)據(jù)持久化操作的情況。
TransactionDefinition
TransactionDefinition(事務(wù)定義)平窘,定義了事務(wù)的一些基礎(chǔ)信息吓肋,如超時時間、隔離級別瑰艘、傳播屬性等是鬼。事務(wù)的定義包含:事務(wù)的隔離級別、事務(wù)的傳播行為紫新、超時時間設(shè)置均蜜、是否只讀。
事務(wù)隔離級別
TransactionDefinition.ISOLATION_DEFAULT:這是默認值芒率,表示使用底層數(shù)據(jù)庫的默認隔離級別囤耳。對大部分數(shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED偶芍。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務(wù)可以讀取另一個事務(wù)修改但還沒有提交的數(shù)據(jù)充择。該級別不能防止臟讀和不可重復(fù)讀,因此很少使用該隔離級別匪蟀。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù)椎麦。該級別可以防止臟讀,這也是大多數(shù)情況下的推薦值萄窜。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務(wù)在整個過程中可以多次重復(fù)執(zhí)行某個查詢铃剔,并且每次返回的記錄都相同撒桨。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢查刻,這些新增的記錄也會被忽略。該級別可以防止臟讀和不可重復(fù)讀凤类。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個執(zhí)行穗泵,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說谜疤,該級別可以防止臟讀佃延、不可重復(fù)讀以及幻讀。但是這將嚴重影響程序的性能夷磕。通常情況下也不會用到該級別履肃。
事務(wù)傳播行為
TransactionDefinition.PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù)坐桩;如果當(dāng)前沒有事務(wù)尺棋,則創(chuàng)建一個新的事務(wù)。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個新的事務(wù)绵跷,如果當(dāng)前存在事務(wù)膘螟,則把當(dāng)前事務(wù)掛起成福。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù)荆残;如果當(dāng)前沒有事務(wù)奴艾,則以非事務(wù)的方式繼續(xù)運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運行内斯,如果當(dāng)前存在事務(wù)蕴潦,則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運行嘿期,如果當(dāng)前存在事務(wù)品擎,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù)备徐,則加入該事務(wù)萄传;如果當(dāng)前沒有事務(wù),則拋出異常蜜猾。
TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù)秀菱,則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運行;如果當(dāng)前沒有事務(wù)蹭睡,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED衍菱。
TransactionStatus
PlatformTransactionManager.getTransaction(…) 方法返回一個 TransactionStatus 對象。返回的TransactionStatus 對象可能代表一個新的或已經(jīng)存在的事務(wù)(如果在當(dāng)前調(diào)用堆棧有一個符合條件的事務(wù))肩豁。TransactionStatus 接口提供了一個簡單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法脊串。該接口定義如清單3所示:
TransactionStatus 接口中定義的主要方法
public interface TransactionStatus{ boolean isNewTransaction(); void setRollbackOnly(); boolean isRollbackOnly();}
事務(wù)的使用方式
環(huán)境搭建
裝配DataSource
根據(jù)實際使用的事務(wù)使用策略裝配事務(wù)管理器,mybatis清钥、jdbc使用DataSourceTransaction琼锋,Hibernate使用HibernateTransaction
編程式事務(wù)管理
裝配TranstactionTemplate,注入事務(wù)管理器祟昭,注入傳播行為和隔離級別
在需要實現(xiàn)事務(wù)的類里面注入TranstactionTemplate缕坎,調(diào)用其execute方法
聲明式事務(wù)管理
利用aop實現(xiàn)的事務(wù)管理,有三種方式
TransactionProxyFactoryBean(不要用篡悟,繁瑣)
- 裝配TransactionProxyFactoryBean(這個類實現(xiàn)了FactoryBean谜叹,調(diào)用這個bean得到的不是這個類的實例,而是FactoryBean的getObject())搬葬,注入目標對象荷腊,注入事務(wù)管理器,注入transactionAttribute(這個屬性是Properties急凰,key為需要事務(wù)的方法女仰,value為傳播行為,隔離級別,只讀)
XML的基于AspectJ聲明事務(wù)
- 使用<tx:advice></tx:advice>聲明事務(wù)管理通知董栽,注入事務(wù)管理器码倦、事務(wù)屬性(傳播行為、隔離級別等)
- 使用aop將通知織入到切入點
注解的基于AspectJ聲明事務(wù)
<tx:annotation-driven transaction-manager="transactionManger"/>
在需要事務(wù)的地方添加@Transaction注解并注入事務(wù)屬性