事务注解 @Transactional

一、当标于类前时, 标示类中全部方法都进行事务处理java

@Transactional public class TestServiceBean implements TestService {
   ...
}

某些方法不须要事务时spring

事务传播行为数据库

@Transactional(propagation=Propagation.REQUIRED) :code

  • 若是有事务, 那么加入事务, 没有的话新建一个(默认状况下)

@Transactional(propagation=Propagation.NOT_SUPPORTED) :blog

  • 容器不为这个方法开启事务

@Transactional(propagation=Propagation.REQUIRES_NEW) :接口

  • 无论是否存在事务,都建立一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.MANDATORY) :事务

  • 必须在一个已有的事务中执行,不然抛出异常

@Transactional(propagation=Propagation.NEVER) :io

  • 必须在一个没有的事务中执行,不然抛出异常(与Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS) :class

  • 若是其余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):串行化

注意的几点

  1. @Transactional 只能被应用到public方法上, 对于其它非public的方法,若是标记了@Transactional也不会报错,但方法没有事务功能
  2. 用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚;遇到不受检查(unchecked)的例外时回滚
  3. @Transactional 注解应该只被应用到 public 可见度的方法上
  4. @Transactional 注解能够被应用于接口定义和接口方法、类定义和类的 public 方法上
  5. Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上
相关文章
相关标签/搜索