Sping中的事务配置
关于Spring的事务配置,主要的配置文件如下(使用了C3P0连接池):
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--导入外部文件资源-->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"/>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
</bean>
<!--声明事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--声明事务通知(相当于切面)-->
<tx:advice id="notifier" transaction-manager="txManager">
</tx:advice>
<!--声明事务通知需要通知的方法-->
<aop:config>
<aop:pointcut id="cutId" expression="execution(* *.*(..))"/>
<aop:advisor advice-ref="notifier" pointcut-ref="cutId"/>
</aop:config>
</beans>
除了在XNL文件中配置事务,而且还可以使用@Transaction注解声明式地管理任务,Spring允许使用@Transaction注解来标注事务方法(只能标注公有方法,因为AOP是基于代理机制的)
也可以将@Transaction注解标注在类级别上,那么类中所有的公共方法都会被定义成支持事务处理的。另外为了支持@Transaction注解,还需要在配置文件中启用<tx:annotion-driven>元素,并为之指定事务管理器,如果事务管理器的名字是transactionManager的话,可以省略。
<context:component-scan base-package="*"/>
<tx:annotation-driven transaction-manager="txManager"/>
事务的传播属性
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播,例如,方法可能继续在现有的事务中运行,也可能开启一个新的事务,并在自己的事务中运行。
Spring制订了7中类型的传播行为:
-REQUIRED 如果有事务在运行,当前的方法就在该事务中运行,否则,就启动一个新的事务,并在自己的事务中运行
-REQUIRED_NEW 必须启动新事务,并在新的事务中运行,并将之前的事务挂起
-SUPPORT 如果有事务在运行,当前方法在这个事务内运行,如果没有,该方法就不在事务中运行
-NOT_SUPPORT 当前的方法不在事务中运行,如果有运行的事务,它将挂起
-MANDATORY 当前方法必须运行在事务内部,如果没有运行的事务,就抛出异常
-NEVER 当前的方法不运行在事务中,如果有运行的事务,就抛出异常
-NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个事务,并在自己的事务中运行
如下代码:
<!--声明事务通知(相当于切面)-->
<tx:advice id="notifier" transaction-manager="txManager">
<tx:attributes>
<tx:method name="methodName" propagation="REQUIRES_NEW"/>
</tx:attributes>
</tx:advice>
事务的隔离级别:
从理论上讲,各个事务之间是完全彼此隔离的,以避免并发事务所导致的问题,在实际开发中为了提升性能,事务会以较低的隔离级别运行,事务的隔离级别可以通过隔离事务属性指定
四个事务隔离级别:
DEFAULT:使用底层数据库默认的隔离级别,大多数数据库的默认隔离级别是READ_COMMITED
READ_UNCOMMITTED:允许事务读取未被其它事务提交的变更,脏读,不可重复读和幻读等问题都会出现
READ_COMMITED:只允许事务读取已经被其它事务提交过的变更,可避免脏读,但不可重复读和幻读的问题仍会出现
REPETABLE_READ:确保事务可以从一个字段中读取相同的值,在这个事务的持续期间,禁止其它事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读的问题仍存在
SERIALIZABLE:确保事务可以从一个表中读取相同的行,在这个事务的持续期间,禁止其它事务对这个表执行输入,更新和删除操作,所有并发问题都可避免,但是性能十分低下。
事务的隔离级别要得到底层数据库引擎的支持,而不是应用框架的支持。
<!--声明事务通知(相当于切面)-->
<tx:advice id="notifier" transaction-manager="txManager">
<tx:attributes>
<tx:method name="methodName" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"/>
</tx:attributes>
</tx:advice>
设置回滚事务属性:
<tx:advice id="txRoll" transaction-manager="txManager">
<tx:attributes>
<!--
rollbackFor:遇到时必须进行回滚
noRollbackFor:一组异常类,遇到时不必回滚
上面两个属性的值都是一组异常类,如果有多个异常类,可用逗号或空格分开
-->
<tx:method name="methodName" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"
rollback-for="java.io.IOException,java.sql.SQLTransientException"
no-rollback-for="java.lang.RuntimeException"/>
</tx:attributes>
</tx:advice>
超时和只读属性:
超时属性:事务在回滚之前可以保持多久,这样可以防止长期运行的事务占用资源
只读属性:表示这个事务只读取数据但是不更新数据,这可帮助数据库引擎优化事务
<tx:advice id="txRoll" transaction-manager="txManager">
<tx:attributes>
<!--
rollbackFor:遇到时必须进行回滚
noRollbackFor:一组异常类,遇到时不必回滚
上面两个属性的值都是一组异常类,如果有多个异常类,可用逗号或空格分开
-->
<tx:method name="methodName" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"
rollback-for="java.io.IOException,java.sql.SQLTransientException"
no-rollback-for="java.lang.RuntimeException"
timeout="30"
read-only="true"
/>
</tx:attributes>
</tx:advice>
Sping中的事务配置的更多相关文章
- Spring事务配置的五种方式(转载)
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- Spring事务配置的五种方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- Spring中的事务
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- 【荐】Spring事务配置的五种方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- spring事务配置详解
一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...
- Spring管理 hibernate 事务配置的五种方式
Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块! 首先我创建了两个类 ...
- Spring事务配置
Spring中事务的配置学习: 1.心法 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一 ...
- Spring事务配置的五种方式 -- 越往后需要Spring版本越高
第五种 基本零配置 个人感觉第四种也可以 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式, ...
- Spring 事务配置的几种方式
参考:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html http://www.cnblogs.com/appleat/arch ...
随机推荐
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- BLE 4.0 与 4.1的区别
蓝牙技术让我们在连接各种设备的时候不再被繁多的数据线所束缚,比如音响.电脑,甚至是汽车.目前最新的蓝牙版本是4.0,相比3.0它进一步降低了功耗,并且也提高了传输效率.近日,蓝牙技术联盟(Blueto ...
- Qt 之 自定义窗口标题栏(非常完善)
http://blog.csdn.net/goforwardtostep/article/details/53494800
- [LeetCode] Substring with Concatenation of All Words(good)
You are given a string, S, and a list of words, L, that are all of the same length. Find all startin ...
- MVC 中的 ViewModel
此文章总结自:http://rachelappel.com/use-viewmodels-to-manage-data-amp-organize-code-in-asp.net-mvc-applica ...
- Eclipse 常用整理
1.编译 eclipse默认是修改程序后自动编译的,如果不能自动编译,你可以查看project->build automatically选项是否被选中. 手动编译整个工程,可以使用Project ...
- OO之美2
面向对象并没有想象中那么神秘,以生活的现实眼光来看更是如此.把面向对象深度浓缩起来,可以概括为: ⑴目标:重用,扩展,兼容 ⑵核心:低耦合,高内聚 ⑶手段:封装变化 ⑷思想:面向接口编程,面向抽象编程 ...
- iOS xib传值--定义方法传值
事件描述: 用xib创建了一个View,里面有按钮,有TableView.我需要将数据在初始化时传递进去,方便TableView来显示信息. 首先想到的是awakeFromNib这个方法(我以为是和V ...
- JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例
上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言 那么我们如何获取 HTTP请求 响应 ...
- Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example: Given the below binary tree andsum =
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...