本文转自:http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html

事务的隔离级别:事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

使用步骤:

步骤一、在spring配置文件中引入<tx:>命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持

<!-- 事务管理器配置, Hibernate单数据源事务 -->    <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory" />    </bean>

    <!-- 使用annotation定义事务 -->    <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />
<!-- 事务管理器配置, Hibernate单数据源事务 --><bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 使用annotation定义事务 --><tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />

步骤三、在接口或类的声明处 ,写一个@Transactional.

要是只在接口上写, 接口的实现类就会继承下来、接口的实现类的具体方法,可以覆盖类声明处的设置
@Transactional   //类级的注解、适用于类中所有的public的方法

事务的传播行为和隔离级别

大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。

事物注解方式: @Transactional

当标于类前时, 标示类中所有方法都进行事物处理 , 例子:

@Transactionalpublic class TestServiceBean implements TestService {} 

当类中某些方法不需要事物时:

@Transactionalpublic class TestServiceBean implements TestService {       private TestDao dao;       public void setDao(TestDao dao) {        this.dao = dao;    }       @Transactional(propagation = Propagation.NOT_SUPPORTED)    public List<Object> getAll() {        return null;    }   }

事物传播行为介绍: 
@Transactional(propagation=Propagation.REQUIRED) 
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) 
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) 
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) 
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) 
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

事物超时设置:
@Transactional(timeout=30) //默认是30秒

事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化

MYSQL: 默认为REPEATABLE_READ级别
SQLSERVER: 默认为READ_COMMITTED

脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据

注意的几点:
1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如下:
@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
throw new Exception("注释");

}
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
throw new RuntimeException("注释");
}

3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。

5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

转载于:https://blog.51cto.com/fengcl/1706397

Spring事务处理,以及Spring事务的传播属性和隔离级别相关推荐

  1. Spring事务传播属性和隔离级别

    Spring事务传播属性和隔离级别 一.Spring事务传播属性(Propagation): 1) REQUIRED(默认属性) 如果存在一个事务,则支持当前事务.如果没有事务则开启一个新的事务.  ...

  2. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...

    146.简介一下Spring支持的数据库事务传播属性和隔离级别 介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录. 在Spring中 ...

  3. mysql事务传播属性_Spring事务传播属性和隔离级别详细介绍

    1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none ...

  4. spring事务传播属性与隔离级别

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为. 有以下选项可供使用: PROPAGATIO ...

  5. Spring的隔离级别事务传播属性数据库隔离级别之间的联系

    一.Spring五大事务隔离级别 Spring事务隔离级别比数据库事务隔离级别多一个default 在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主.1) ...

  6. Spring事务的传播行为和隔离级别

    ********TransactionDefinition 接口定义******************* /** * Support a current transaction, create a ...

  7. 事务的传播行为和隔离级别[transaction behavior and isolated level]

    Spring中事务的定义: 一.Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用: PROPAGATION_REQUIRE ...

  8. Java中事务的传播机制和隔离级别

    一.传播机制 Spring事务的传播机制是指在方法调用链中,对于已经开启的事务以及后续子方法如何处理事务.Spring框架提供了7种传播行为来控制事务的传播过程,分别为: PROPAGATION_RE ...

  9. 事务的传播行为和隔离级别?

    传播行为:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播. Spring 定义了如下七中传播行为,这里以A业务和B业务之间如何传播事务为例说明: 1.PROPAGATION_REQUIRE ...

最新文章

  1. CentOS7(64位)下运行IPython3出错解决办法
  2. copy与mutableCopy的区别总结
  3. day13 迭代器和生成器
  4. python怎么设置回文数_python如何写一个函数判断回文数?
  5. 数据挖掘竞赛,算法刷题网址汇总
  6. linux安装nsenter工具,Docker 使用nsenter工具进入容器的操作
  7. ssh自动登陆和scp自动拷贝文件
  8. 百度风云榜前50名小偷——专门用于提高你网站的流量!
  9. Atitit 运维之道 v2 s09.docx Atitit 运维之道 目录 1. 概念 2 1.1. devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监
  10. 如何使用Python3连接MySQL
  11. 流量治理神器-Sentinel限流熔断应用实战
  12. VMware Fusion Pro v10.1.6 苹果虚拟机免费版及解锁许可证
  13. Gif图片分解(支持批量)
  14. 二元一次方程有唯一解的条件_线性方程组在什么时候有唯一解/无穷个解/无解?...
  15. 科幻链接现实:加密艺术的诞生与发展
  16. linux live cd哪个好,最佳的 Linux LiveCD
  17. 好的plm软件有哪些?plm软件排行榜
  18. srand rand RAND_MAX
  19. 一文搞懂什么是QPS PV 关于并发的面试
  20. 浏览DELPHI的源代码

热门文章

  1. sql能查到数据 dataset对象里面没有值_DataSet
  2. ppt提示内存或系统资源不足_为何手机一直提示内存不足?原来是它们惹的祸,赶紧清了...
  3. java查看上下文加载器_线程上下文类加载器
  4. mysql if begin end_MySQL存储过程例子,不能在if else里面用begin end否则会报错Erro_MySQL...
  5. android 自定义屏保,android 自定义屏保问题
  6. python读取pdf文档书签 bookmark_Python利用PyPDF2库获取PDF文件总页码实例
  7. python xlrd xlwt pandas 模块 区别_python如何读写excel文件|python教程|python入门|python教程...
  8. visio wps 流程图_科研必备:几款好用的流程图工具,助力你的论文/科研绘图
  9. fedora java环境变量_Fedora Linux,JDK安装与配置环境变量
  10. python seek tell_PYTHON学习14.09:Python seek()和tell()函数详解