1.事務的管理方式可以分爲兩種:
a)編程式事務管理: 通過代碼編寫的形式進行事務管理的方式
b)聲明式事務管理: 通過配置的形式進行事務管理的方式
Spring中的聲明式事務是藉助AOP實現的. 聲明事務還提供了對事務更細緻的控制.
2.完成聲明式事務的配置
必須依賴spring-tx.jar包和tx及aop命名空間
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--此處用於配置聲明式事務-->
<!--配置事務管理器: 在spring-jdbc.jar提供了事務管理器, DataSourceTransactionManager-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事務通知-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!--對切點方法進行更細緻的管理, 查詢方法不進行事務控制, 其他方法要進行事務控制-->
<!--增刪改操作時, 沒有異常就會提交, 有異常就會回滾-->
<!--允許使用通配符來描述此處的方法名, 通過方法名稱來區別是查詢操作還是增刪改操作-->
<tx:method name="sel*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="*List" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!--配置AOP-->
<aop:config>
<aop:pointcut id="pc" expression="execution(* com.bjsxt.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />
</aop:config>
</beans>
3.聲明式事務中常見的屬性介紹
3.1name屬性
通過通配符定義方法名稱, 用於區分查詢操作和增刪改操作
3.2read-only屬性
布爾值, 默認爲false, 表示增刪改操作, spring會進行事務管理; 如果設置爲true, 表示只讀操作(查詢), spring不對其進行事務管理, 能夠提升查詢的效率.
3.3rollback-for屬性
用於指定發生什麼異常時要進行事務的回滾. 默認不需要配置, spring會在發生運行時異常時進行事務的回滾.
3.4no-rollback-for屬性
用於指定當發生什麼異常時不進行事務的回滾. 基本不會配置.
3.5isolation屬性
用於指定事務的隔離級別. 取值有:
- DEFAULT, 表示採用數據庫默認的隔離級別
- READ_UNCOMMITTED, 表示可以讀取到未提交的數據. 可能發生髒讀, 不可重複讀和幻讀. 安全性最低, 效率最高.
- READ_COMMITTED, 表示只能讀取到已經提交的數據, 可以防止髒讀, 無法防止不可重複讀和幻讀.
- REPEATABLE_READ, 表示可以重複讀取. 可以防止髒讀和不可重複讀. 可能發生幻讀. 實現方式是給行加鎖.
- SERIALIZABLE, 表示序列化(排隊). 級別最高, 防止發生髒讀, 不可重複讀和幻讀. 給整張表加鎖. 安全性最高, 效率最差.
需要先明白幾個專業詞彙:
髒讀: 讀取髒數據(未提交的數據)的過程
不可重複讀: 在同一次事務中, 兩次讀取的數據不一致.
幻讀: 針對整張表格查詢, 同一次事務中, 兩次查詢整張表格結果不一致
3.6propagation屬性
事務的傳播行爲. 常用的屬性:
- REQUIRED, 默認值. 必須在事務環境下執行, 如果當前有事務, 則使用當前事務執行; 如果當前沒有事務, 創建事務執行.
- REQUIRES_NEW. 必須在事務環境下執行, 如果當前沒有事務, 創建事務執行; 如果當前有事務, 將當前事務掛起, 創建新事務執行, 結束後原來的事務繼續執行.
- SUPPORTS. 支持事務環境. 如果當前有事務, 使用當前事務環境執行; 如果當前沒有事務, 可以在非事務環境執行.
- NOT_SUPPORTED. 不支持事務. 如果當前沒有事務, 則正常執行; 如果當前有事務, 將事務掛起, 在非事務環境下執行, 之後原來的事務繼續執行.
- MANDATORY. 必須在事務環境執行. 如果當前有事務, 則在當前事務環境執行; 如果當前沒有事務, 直接拋出異常.
- NEVER. 必須沒有事務. 如果當前沒有事務, 正常執行; 如果當前有事務, 直接拋出異常.
- NESTED. 嵌套的. 如果當前沒有事務, 創建事務執行; 如果當前已有事務, 再創建一個嵌套的事務繼續執行(不會掛起原有的事務).