使用原生的JDBC API進行事務管理java
[1]獲取數據庫鏈接Connection對象mysql
[2]取消事務的自動提交spring
[3]執行操做sql
[4]正常完成操做時手動提交事務數據庫
[5]執行失敗時回滾事務express
[6]關閉相關資源編程
1 1.編程式事務 2 //1.獲取Connection對象
3 Connection conn = JDBCUtils.getConnection(); 4 try { 5 //2.開啓事務:阻止自動提交
6 conn.setAutoCommit(false); 7 //3.執行數據庫操做
8 chain.doFilter(req,resp); 9 //4.提交事務
10 conn.commit(); 11 }catch(Exception e) { 12 //5.回滾事務
13 conn.rollBack(); 14
15 }finally{ 16 //6.釋放資源
17 }
一、基本原理:AOP併發
[1]前置通知:開啓事務性能
[2]返回通知:提交事務url
[3]異常通知:回滾事務
[4]後置通知:釋放資源
二、事務管理器
DataSourceTransactionManager:配置該類的bean對象,並配置
三、導入jar包
[1]IOC容器須要的jar包
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
[2]AOP須要的jar包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
[3]JdbcTemplate操做須要的jar包
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
[5]MySQL驅動和C3P0
c3p0-0.9.1.2.jar
mysql-connector-java-5.1.37-bin.jar
四、配置
[1]配置數據源
<!-- 引入外部屬性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置數據源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.passowrd}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
</bean>
[2]配置JdbcTemplate,並裝配數據源
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
[3]配置事務管理器,並裝配數據源
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name= "dataSource" ref ="comboPooledDataSource"/>
</bean >
[4]開啓基於註解的聲明式事務功能
<tx:annotation-driven transaction-manager ="dataSourceTransactionManager"/>
若是事務管理器的bean的id正好是transaction-manager的默認值transactionManager,則能夠省略
[5]在事務方法上加@Transactional註解,便可開啓該方法的事務
五、事務屬性的設置
①事務的傳播行爲
事務傳播屬性能夠在@Transactional註解的propagation屬性中定義。
REQUIRED
REQUIRES_NEW
②事務的隔離級別
用@Transactional註解聲明式地管理事務時能夠在@Transactional的isolation屬性中設置隔離級別
①讀未提交:READ UNCOMMITTED
容許Transaction01讀取Transaction02未提交的修改。
②讀已提交:READ COMMITTED
要求Transaction01只能讀取Transaction02已提交的修改。
③可重複讀:REPEATABLE READ
確保Transaction01能夠屢次從一個字段中讀取到相同的值,即Transaction01執行期間禁止其它事務對這個字段進行更新。
④串行化:SERIALIZABLE
確保Transaction01能夠屢次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行添加、更新、刪除操做。能夠避免任何併發問題,但性能十分低下。
③事務根據什麼異常不進行回滾
@Transactional 註解
[1]rollbackFor屬性:指定遇到時必須進行回滾的異常類型,能夠爲多個
[2]noRollbackFor屬性:指定遇到時不回滾的異常類型,能夠爲多個
④事務的超時屬性
@Transactional的timeout屬性中設置超時屬性
⑤事務的只讀屬性
@Transactional的readOnly=true屬性中設置只讀屬性,多用於查詢操做
一、配置數據源
<!-- 引入外部屬性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置數據源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.passowrd}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
</bean>
二、配置JdbcTemplate,並裝配數據源
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
三、配置事務管理器,並裝配數據源
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name= "dataSource" ref ="comboPooledDataSource"/>
</bean >
四、配置切入點表達式
經過<aop:config></aop:config>標籤
配置切入點表達式<aop:pointcut></aop:pointcut>
經過<aop:advisor></aop:advisor>標籤將事務與切入點表達式聯繫起來,明確事務做用的對象
五、配置事務
經過<tx:advice></tx:advice>標籤的 transaction-manager屬性將當前事物加入到事務管理器
經過<tx:attributes></tx:attributes>標籤下的<tx:method></tx:method>標籤,配置事務做用範圍內的方法的傳播行爲、隔離級別、異常回滾、超時屬性和只讀屬性
六、詳細步驟:
<!-- 配置基於XML文件的聲明式事務 -->
<aop:config>
<!-- 配置切入點表達式 -->
<aop:pointcut expression="execution(* com.neuedu.tx.service.BookService.*(String, String))" id="txPointCut"/>
<!-- 將事務切入點和事務建議的配置聯繫起來 -->
<aop:advisor advice-ref="bookTransaction" pointcut-ref="txPointCut"/>
</aop:config>
<!-- 設置事務屬性 -->
<tx:advice id="bookTransaction" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="doCash"
propagation="REQUIRED"
isolation="READ_COMMITTED"
read-only="false"
no-rollback-for="java.lang.ArithmeticException"
timeout="3" />
<!-- 將某一類方法統一設置爲只讀 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
</tx:attributes>
</tx:advice>