SpringBoot2.x系列教程10-springboot集成事务

在程序开发的过程中,我们一般会碰到这样的场景:在一个功能实现的过程中可能需要调用多个服务类来操作数据库,这其中既有插入的操作,又有更新的操作,一般出于最后数据库结果的准确性,我们会在这段代码的方法之前加一个事物的注解,或者将这段代码所在的包纳入注解扫描的范围内,从而实现程序由于各种各样的原因导致奔溃也不会造成数据的不准确性。


什么是事务?

事物是指程序中一系列严密的逻辑操作,而且所有的操作必须全部成功完成,否则在每个操作中所有的更改都会被撤销,通俗而言就是所有的操作要么成功,要么不成功,没有其他的情况。

1、事务的特征

原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要有其中一个指令执行失败,所有的执行都会执行失败,数据进行回滚,回到执行之前的状态。

一致性:事务的执行使数据从一个状态转化为另一个状态,但是对于数据的完整性保持稳定。

隔离性:隔离性是当多个用户并发访问数据库时,比如同时操作一张表时,数据为每一个用户开启的事务,不能被其他的事务的操作所干扰,多个并发事务之间需要相互隔离。

持久性:当事务执行完成后,对于数据的改变是永久性的。

2、事务的隔离级别

读未提交(Read uncommitted):一个事务可以读取另一个未提交的事物的数据。

读已提交(Read committed):一个事务要等待另一个事务提交后才能读取数据。

可重复读(Repeatable Read):开始读取事务时,不在允许修改操作

串行化(Serializable):事务的最高隔离级别,在该隔离级别下,事务串行化顺序执行,可以避免脏读、不可重复读、幻读,但是这种事务的隔离级别比较低下,比较耗费数据库性能,一般不使用。

3、不同隔离级别带来的问题

读未提交(Read uncommitted):可能产生脏读的问题。

读已提交(Read committed):产生不可重复读的问题。

可重复读(Repeatable Read):可能产生幻读的问题。

串行化(Serializable):可避免脏读、不可重复读、幻读。


springboot开启事务

前面已经讲解了关于事务的一些理论知识,那么就springboot而言,到底应该怎么引入事务呢?其实处理的过程也是非常的简单,只需要按照下面的步骤就可以了。

1、在启动配置类中配置@EnableTransactionManagement注解

2、在涉及到需要用到事务的方法中增加@Transactional注解

参考资料

[1]、https://cloud.tencent.com/developer/article/1133074

经验分享 程序员 微信小程序 职场和发展