1. 程式人生 > >【spring】事務管理

【spring】事務管理

一、事務

1.1事物的特性

        原子性、永續性、一致性、隔離性

1.2不考慮隔離性存在的安全問題

        讀問題:髒讀、不可重複讀、幻讀、

        寫問題:寫更新丟失

1.3讀問題的解決方案

        設定隔離級別:由低到高:讀未提交,讀已提交,可重複讀,可序列化(自己翻譯的,Serializable)。

1.4寫問題的解決方案

        方案一:資料庫設定

        方案二:程式設計師手動實現,通常通過比對更新版本號

二、spring事務管理的介紹

事務平臺管理器   PlatformTransactionManager:介面

事務定義資訊   TransactionDefinition

事務的狀態   TransactionStatus

事務的傳播行為   :

Spring中提供了七種事務的傳播行為:

類別一:保證多個操作在同一個事務中

  1. PROPAGATION_REQUIRED
    :預設值,如果A中有事務,使用A中的事務,如果A沒有,建立一個新的事務,將操作包含進來
  2. PROPAGATION_SUPPORTS :支援事務,如果A中有事務,使用A中的事務。如果A沒有事務,不使用事務。
  3. PROPAGATION_MANDATORY :如果A中有事務,使用A中的事務。如果A沒有事務,丟擲異常。

 

 

類別二:保證多個操作不在同一個事務中

  1. PROPAGATION_REQUIRES_NEW :如果A中有事務,將A的事務掛起(暫停),建立新事務,只包含自身操作。如果A中沒有事務,建立一個新事務,包含自身操作。
  2. PROPAGATION_NOT_SUPPORTED
    :如果A中有事務,將A的事務掛起。不使用事務管理。
  3. PROPAGATION_NEVER :如果A中有事務,報異常。

 

 

類別三:巢狀式事務

  1. 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"/>