Spring事務提供了兩種管理的的方式:編程式事務和聲明式事務
簡單回顧下事務:
事務:邏輯上的一組操作,組成操作的各個單元,要么全部成功,要么全部失敗。
事務特性:
原子性:一個事務包含的各個操作單元不可分割
一致性:事務執行前后數據應當保持一致
隔離性:一個事務的執行不應當受到其他事務的干擾
持久性:事務執行完之后,數據就被持久化到磁盤上
Spring事務管理常用的API:
PlatformTransactionmanager:平臺事務管理器
平臺事務管理器:是一個接口,是spring用于管理事務的真正的對象
? ? ? DataSourceTransactionManager:底層使用JDBC管理事務的時候的具體實現類
? ? ? HibernateTransactionManager:底層使用Hibernate管理事務時候的具體實現類
TransactionDefinition:事務定義信息
事務定義:用于定義事務的相關的信息,隔離級別、超時信息、傳播行為、是否只讀
TransactionStatus:事物的狀態
事務狀態:用于記錄事務管理過程中,事務的狀態的對象。
事務管理API的關系:
spring進行事務管理的時候,首先平臺事務管理器根據事務定義信息進行事務的管理,在事務管理過程中,就會產生各種狀態,將這些狀態及信息記錄到事務狀態的對象中。
Spring事務的傳播行為
spring事務傳播行為主要負責業務層之間互相調用的復雜問題。spring會提供7種事務的傳播行為,大概可以分為三類:
假設有A/B兩個方法,各自包含不同的事務操作。
保證多個操作在同一個事務中?
PROPAGATION_REQUIRED?(常用):默認值,B事務所在的方法調用A事務所在的方法,如果A中有事務,則使用A中的事務(包含B事務),如果A沒有,創建一個新的事務,將操作包含進來
PROPAGATION_MANDATORY :如果A中有事務,使用A中的事務。如果A沒有事務,拋出異常。
PROPAGATION_SUPPORTS :支持事務,如果A中有事務,使用A中的事務。如果A沒有事務,不使用事務。
保證多個操作不在同一個事務中
???????PROPAGATION_REQUIRES_NEW?(常用):B事務所在的方法調用A事務所在的方法,如果A中有事務,將A的事務掛起(暫停),創建新事務,只包含B自身操作。如果A中沒有事務,創建一個新事務,包含B自身操作。
PROPAGATION_NEVER :如果A中有事務,報異常。
PROPAGATION_NOT_SUPPORTED :如果A中有事務,將A的事務掛起。不使用事務管理
嵌套式事務
PROPAGATION_NESTED?(常用):嵌套事務,B事務所在的方法調用A事務所在的方法,如果A中有事務,按照A的事務執行,執行完成后,設置一個保存點,執行B中的操作,如果沒有異常,執行通過,如果有異常,可以選擇回滾到最初始位置(A執行前),也可以回滾到保存點。
Spring的事務管理
聲明式事務管理:
xml方式聲明事務管理:
<!--配置service-->
<bean id="accountservice" class="com.demo1.tx.AccountServiceImp">
<property name="accountDao" ref="accountdao"/>
</bean>
<!--配置dao-->
<bean id="accountdao" class="com.demo1.dao.AccountDaoImp">
<property name="dataSource" ref="datasource"/>
</bean>
<!--1、配置數據庫連接池,引入數據庫配置文件-->
<context:property-placeholder location="classpath:com/demo1/jdbc.properties"/>
<bean id="datasource" class="www".120xh.cn"com.mchange.www.dfgj157.com?v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"www.fengshen157.com//>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--2、配置事務管理器-->
<bean id="transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<!--3、配置事務的增強:需要注入一個事務管理器屬性-->
<tx:advice transaction-manager="transactionManager" id="txadvice">
<tx:attributes>
<!--事務管理的規則-->
<tx:method name="*" propagation="REQUIRED"/> <!--表示設置所有方法的傳播行為為required-->
</tx:attributes>
</tx:advice>
<!--4、aop的配置-->
<aop:config>
<aop:pointcut id="pointcut1" expression="execution(* com.demo1.tx.AccountServiceImp.*(..))"/>
<!--配置切入點為AccountServiceImp類下面的所有方法-->
<!-- <aop:aspect/> 多個切入點和多個通知的組合-->
<!--一個切入點和一個通知的組合-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
</aop:config>
注解方式聲明事務管理:
配置事務管理器
<bean id="transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"/> </bean>
開啟事務注解
??????????????<tx:annotation-driven transaction-manager="transactionManager"/>
業務層方式上添加注解