簡介:
事務是
一系列的動做,它們綜合在一塊兒纔是一個完整的工做單元,這些動做必須所有完成,若是有一個失敗的話,那麼事務就會回滾到最開始的狀態,彷彿什麼都沒發生過同樣。
在企業級應用程序開發中,事務管理必不可少的技術,用來確保數據的完整性和一致性。
特性:(能夠忽略)
統一的接口
PlatformTransactionManager : 事務管理器
TransactionDefinition : 事務的一些基礎信息,如超時時間、隔離級別、傳播屬性等
TransactionStatus : 事務的一些狀態信息,如是不是一個新的事務、是否已被標記爲回滾
spring中的事務實現類
spring中事務的實現方式
1.
編程式的事務管理
1)事務管理器:具體的事務管理實現類,jdbc
org.springframework.jdbc.datasource.DataSourceTransactionManager
須要注入:datasource
2)事務管理的模板:
org.springframework.transaction.support.TransactionTemplate
須要注入:事務管理器
3)在類中對模板進行使用 .execute()
2. 使用XML配置
聲明式的事務管理(原始方式)
1)事務管理器
2)配置代理類:
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
3. 使用XML配置
聲明式的事務管理,基於tx/aop
1)事務管理器
<!-- 配置事務的通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation :事務傳播行爲
isolation :事務的隔離級別
read-only :只讀
rollback-for:發生哪些異常回滾
no-rollback-for :發生哪些異常不回滾
timeout :過時信息
-->
<tx:method name="transfer" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入點 -->
<aop:pointcut expression="execution(* com.zs.spring.demo3.AccountService+.*(..))" id="pointcut1"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
4. 使用註解配置
聲明式事務
1)事務管理器
2)開啓事務掃描
<tx:annotation-driven transaction-manager="transactionManager"/>
3)添加 @Transactional 註解,定義屬性
事務的屬性:5個維度
傳播行爲
當一個事務方法調用另外一個事務方法的時候
1)是否支持事務:
2)使用誰的事務
隔離規則:
針對可能存在的併發問題,選擇設置什麼樣的行鎖和表鎖
從上到下,隔離級別愈來愈高,效率愈來愈低
回滾規則
針對異常,設置哪些異常不回滾
是否只讀
只讀狀況下,數據庫不接受修改,若是修改報錯
org.springframework.dao.
TransientDataAccessResourceException: PreparedStatementCallback; SQL [update account set money = money-? where name = ?];
Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
事務超時
若是超過設定的時間,直接回滾
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">java