@Transactional注解详解

@Transactional注解可以作用于接口、接口方法、类以及类方法上

@Transactional注解的可用参数
readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚

noRollbackForClassName

参照上方的例子

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

propagation

该属性用于设置事务的传播行为

事物传播行为介绍:

  1. @Transactional(propagation=Propagation.REQUIRED) 如果有事务, 那么加入事务, 没有的话新建一个(默认)

  2. @Transactional(propagation=Propagation.NOT_SUPPORTED) 容器不为这个方法开启事务

  3. @Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

  4. @Transactional(propagation=Propagation.MANDATORY) 必须在一个已有的事务中执行,否则抛出异常

  5. @Transactional(propagation=Propagation.NEVER) 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)

  6. @Transactional(propagation=Propagation.SUPPORTS) 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务

isolation

该属性用于设置底层数据库的事务隔离级别

事务隔离级别介绍:

  1. @Transactional(isolation = Isolation.READ_UNCOMMITTED)读取未提交数据(会出现脏读, 不可重复读) 基本不使用

  2. @Transactional(isolation = Isolation.READ_COMMITTED)读取已提交数据(会出现不可重复读和幻读)

  3. @Transactional(isolation = Isolation.REPEATABLE_READ)可重复读(会出现幻读)

  4. @Transactional(isolation = Isolation.SERIALIZABLE)串行化

什么是脏读、幻读、不可重复读?

  1. 脏读 : 一个事务读取到另一事务未提交的更新数据

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

  3. 幻读 : 一个事务读到另一个事务已提交的insert数据

其中MySQL默认使用的隔离级别为REPEATABLE_READ、Oracle的为READ_COMMITTED

640?wx_fmt=gif

不得不看

1.SpringCloud系列博客汇总

2.为啥一线大厂面试必问Redis,有啥好问的?

3.Java多线程面试必备基础知识汇总

4.Java集合源码分析汇总

5.Linux常用命令汇总

6.JVM系列文章汇总

7.MySQL系列文章汇总

8.RabbitMQ系列文章汇总

640?wx_fmt=jpeg

你可能感兴趣的:(@Transactional注解详解)