springboot事物管理的方式以及事务的隔离级别

 

添加事物管理

在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自
动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外配置就可
以用@Transactional注解进行事务的使用

操作(使用方法):

Spring Boot 使用事务非常简单,首先在启动类上使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法(或类)上添加注解 @Transactional(  建议使用 @Transactional(rollbackFor = Exception.class)  ) 便可。

注意:

@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到  非运行时异常  时也回滚。

什么是运行时异常和非运行时异常

    运行时异常:程序运行过程中才有可能出现的异常,这种异常一般是由程序逻辑错误引起的。如:NullPointerException、IndexOutOfBoundsException

    非运行时异常:JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过的异常。如:SQLException、SQLException

如图案列一(将注解加在类上面):

如图案列二(将注解加在方法上面):


事务的隔离级别

含义:

隔离级别是指在发生并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读、不可重复读、幻
读。

什么是脏读、不可重复读、幻读
脏读:A事务执行过程中修改了id=1的数据,未提交前,B事务读取了A修改的id=1的数据,而A事务却回滚了,这
样B事务就形成了脏读。


不可重复读:A事务先读取了一条数据,然后执行逻辑的时候,B事务将这条数据改变了,然后A事务再次读取的时
候,发现数据不匹配了,就是所谓的不可重复读了。


幻读:A事务先根据条件查询到了N条数据,然后B事务新增了M条符合A事务查询条件的数据,导致A事务再次查询
发现有N+M条数据了,就产生了幻读。

操作(使用方法):

通过使用 isolation 属性设置,例如:

开发时候建议改为:@Transactional(isolation = READ_COMMITTED)  

原因如下:

org.springframework.transaction.annotation.Isolation 枚举类中定义了五个表示隔离
级别
的值:

public enum Isolation {
  DEFAULT(-1),
  READ_UNCOMMITTED(1),
  READ_COMMITTED(2),   //建议设置为这个级别
  REPEATABLE_READ(4),
  SERIALIZABLE(8);
}
五个隔离级别值的含义

     DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就
是: READ_COMMITTED 。


    READ_UNCOMMITTED :该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别
不能防止脏读和不可重复读,因此很少使用该隔离级别。


    READ_COMMITTED :该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏
读,这也是大多数情况下的推荐值,性能最好。


    REPEATABLE_READ :该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返
回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别
可以防止脏读和不可重复读。


    SERIALIZABLE :所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别
可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。


 


 

发布了33 篇原创文章 · 获赞 23 · 访问量 6606

猜你喜欢

转载自blog.csdn.net/weixin_40516924/article/details/103408598