Spring的事务管理

42 阅读3分钟

1.事务的介绍和操作

1.1介绍

我们都知道,Mysql语句的事务是自动提交的,也就是说,当执行一条DML(数据操纵语言)语句后,Mysql会立即隐式提交事务。而本文章要介绍的事务管理:他是一组操作的集合,他是不可分割的工作单位,把所有的sql语句作为一个整体提交,如果sql语句中有一条失败,那么就不会提交,只有全部成功才会成功。这样的事务操作可以避免sql操作联表时不会出现主表成功,从表失败的情况,保证两张表的数据统一性。

1.2操作介绍

事务控制主要通过三步操作:

  • 开启事务:start transaction;/begin;
  • 提交事务/回滚事务:commit;/rollback; 试用的场景有:银行转账,下单扣库存等等;

2.Spring的事务管理

事务管理通常加在业务层(Service)的方法上,也可以加在类和接口上,不过并不推荐。要让Spring来管理我们的事务,只需要添加一个注解@Transactional在方法上,这样就可以将当前方法交给Spring管理了。 执行顺序是:

  1. 方法执行前开启事务
  2. 成功执行完毕,提交事务/出现异常,回滚事务

这里以一个员工表和员工工作经历表的联表的事务管理来示范事务管理的使用

image.png

@Transactional(rollbackFor = Exception.class)来修饰了addEmpAndExprList方法,其中调用了两个添加数据库的sql语句,增加事务管理的注解后,如果检测到任何一个语句报错,就会执行事务的rollback操作,即事务回滚,不提交。

3.事务进阶用法

  • rollbackfor:通常情况下只使用@Transactional来修饰方法时,只有在检测到RunTimeException时才会事务回滚,而往往我们的要求是出现异常后回滚,所以我们可以用@Transactional(rollbackFor = Exception.class)来修饰方法,这样只要检测到异常就会回滚,也可以修改成其他异常来满足我们的要求
  • propagation:当一个事务方法被另外一个事务方法包含在内时,如果想要控制被包含的事物方法独自提交,可以使用propagation来控制,propagtion有两个常用的属性值:
  1. REQUIRED:是@Transactional注解的默认值,如果包含了该事务的事务已经被@Transactional修饰,则加入该事务中。
  2. REQUIRED_NEW:有该属性的@Transactional注解修饰的方法需要事务管理时,无论有无事务已经管理,都创建一个新事务来控制该方法的事务提交。

这里对REQUIRED_NEW的使用场景举一个例子:在新增员工信息时,无论失败还是成功,都要记录相关的操作日志。

4.事务的四大特性

  1. 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败。
  2. 一致性:事务完成时,必须使所有的数据都保持一致状态。
  3. 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  4. 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

以上就是我对Spring的事务管理的介绍。。。