一. 什么是事务?
我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态。
事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务。
二. 快速入门?
在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用。
三. 传播行为
事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。Spring定义了七种传播行为:
3.1 PROPAGATION_REQUIRED (required , 必须 默认值)
A如果有事务,B将使用该事务;
如果A没有事务,B将创建一个新的事务。
3.2 PROPAGATION_SUPPORTS(supports ,支持)
A如果有事务,B将使用该事务;
如果A没有事务,B将以非事务执行。
3.3 PROPAGATION_MANDATORY(mandatory ,强制)
A如果有事务,B将使用该事务;
如果A没有事务,B将抛异常。
3.4 PROPAGATION_REQUIRES_NEW (requires_new,必须新的)
如果A有事务,将A的事务挂起,B创建一个新的事务;
如果A没有事务,B创建一个新的事务。
3.5 PROPAGATION_NOT_SUPPORTED (not_supported ,不支持)
如果A有事务,将A的事务挂起,B将以非事务执行;
如果A没有事务,B将以非事务执行。
3.6 PROPAGATION_NEVER (never,从不)
如果A有事务,B将抛异常;
如果A没有事务,B将以非事务执行。
3.7 PROPAGATION_NESTED (nested ,嵌套)
A和B底层采用保存点机制,形成嵌套事务。
外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。