【spring】事務管理
阿新 • • 發佈:2018-12-25
一、事務
1.1事物的特性
原子性、永續性、一致性、隔離性
1.2不考慮隔離性存在的安全問題
讀問題:髒讀、不可重複讀、幻讀、
寫問題:寫更新丟失
1.3讀問題的解決方案
設定隔離級別:由低到高:讀未提交,讀已提交,可重複讀,可序列化(自己翻譯的,Serializable)。
1.4寫問題的解決方案
方案一:資料庫設定
方案二:程式設計師手動實現,通常通過比對更新版本號
二、spring事務管理的介紹
事務平臺管理器 PlatformTransactionManager:介面
事務定義資訊 TransactionDefinition
事務的狀態 TransactionStatus
事務的傳播行為 :
Spring中提供了七種事務的傳播行為:
類別一:保證多個操作在同一個事務中
- PROPAGATION_REQUIRED
- PROPAGATION_SUPPORTS :支援事務,如果A中有事務,使用A中的事務。如果A沒有事務,不使用事務。
- PROPAGATION_MANDATORY :如果A中有事務,使用A中的事務。如果A沒有事務,丟擲異常。
類別二:保證多個操作不在同一個事務中
- PROPAGATION_REQUIRES_NEW :如果A中有事務,將A的事務掛起(暫停),建立新事務,只包含自身操作。如果A中沒有事務,建立一個新事務,包含自身操作。
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER :如果A中有事務,報異常。
類別三:巢狀式事務
- PROPAGATION_NESTED :巢狀事務,如果A中有事務,按照A的事務執行,執行完成後,設定一個儲存點,執行B中的操作,如果沒有異常,執行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到儲存點。
三、spring事務管理的三種操作實現
1.程式設計式事務
大致步驟:
步驟一:搭建spring,基礎IOC,AOP環境,還有JDBC的環境,最後還有事務管理的jar包(tx)。
步驟二:配置平臺事務管理器(org.springframework.jdbc.datasource.DatasourceTransactionManager)、
事務模板類(org.springframework.transaction.support.TransactionTemplate)
步驟三:利用事務模板類.execute(new TransactionCallbackWithoutResult(){ 事務所在的方法 })
2.宣告式事務
2.1XML的方式
<?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:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context.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">
<!-- 配置連線池,獲得DataSource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring4_day03"/>
<property name="user" value="root"/>
<property name="password" value="a"/>
</bean>
<!-- 配置DAO -->
<bean id="accountDao" class="testSpring.tx.temp.AccountDaoimpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置service -->
<bean id="accountService" class="testSpring.tx.temp.AccountServiceImple">
<property name="accountDao" ref="accountDao"></property>
</bean>
<!-- 配置事務管理器=============================== -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事務的增強==可以配置tx:aspect多個切面,多個切入點============================= -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 事務管理的規則 -->
<!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/> -->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- aop的配置 -->
<aop:config>
<aop:pointcut expression="execution(* testSpringJDBC.temp.test.*(..))" id="pointcut1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
</beans>
2.2註解的方式
<!-- 去除切面的配置,只留下事務管理平臺的配置,在類的宣告前加入@Transactional.即可 -->
<tx:annotation-driven transaction-manager="transactionManager"/>