spring 事务及事务失效相关面试题

如何使用Spring事务

在serviceImpl方法上加Transactional注解

 @Transactional(rollbackFor = Exception.class)

事务失效场景

  • 数据库引擎不支持事务
    对于Mysql数据库而言innodb支持事务,myisam不支持
  • Service类没有交给Spring管理
    spring事务是基于AOP
  • Service的方法必须是public,private、final、static方法不生效(private方法是用户私有的方法,用户自己去维护,static方法是类方法,不是spring 的bean)
  • 必须在同一个线程里
    以下代码不生效
 @Transactional(rollbackFor = Exception.class)
 public void f(){
   new Thread(()->{
   //....
   }).start();
 }
  • 在同一个service中 非事务方法调用事务方法事务一定不生效
    两个事务方法调用生效

7种事务的传播机制(可通过spring配置或注解来设置)
REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。
SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。
MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。
REQUIRES_NEW:创建一个新事务,如果当前事务存在,把当前事务挂起。
NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起。
NEVER:无事务执行,如果当前有事务则抛出Exception。
NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。
注解配置时如:@Transactional(propagation=Propagation.REQUIRED)

四种隔离级别
注解配置时如:@Transactional(isolation = Isolation.READ_UNCO

事务隔离级别 脏读 不可重复读 幻读
读未提交(Read-Uncommitted) 是 是 是
不可重复读(Read-Committed) 否 是 是
可重复读(Repeatable-Read) 否 否 是
串行化(Serializable) 否 否 否
其中:可重复读(repeatable-read)表示:在开始读取数据(事务开启)时,不再允许修改操作

你可能感兴趣的:(Java,Spring)