事务的基本概念:事务是把一组操作封装成一个执行单元(封装到一起),要么全部成功,要么全部失败。
实现事务的原理:是通过 日志 来实现的。会记录一个日志,只有事务的开始和事务的执行,但是没有事务的结束。等下一次恢复的时候,会进行日志的自检,如果发现日志只执行了一半,没执行完,就会执行补偿机制。
事务的特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
Spring 事务的实现:
MySQL 中的事务使⽤:
事务在 MySQL 有 3 个重要的操作:开启事务、提交事务、回滚事务。
Spring中实现事务主要有两种方式:
- 编程式事务(手动写代码操作事务)
- 声明式事务(里有注解自动开启和提交事务。
编程式事务:编程式事务是Spring框架中一种事务管理方式,与声明式事务不同,它要求开发者在代码中显式地管理事务的开始、提交和回滚。这种方式提供了更大的灵活性,允许开发者在业务逻辑中精确地控制事务的边界。
DataSourceTransactionManager ⽤来开启事务、提交或回滚事务,
TransactionDefinition 是事务的属性
声明式事务:声明式事务是Spring框架中一种更为常见和推荐使用的事务管理方式。与编程式事务不同,声明式事务允许开发者通过配置(如XML配置文件或注解)来声明哪些方法需要事务管理,而不是在业务逻辑代码中直接编写事务控制代码。这种方式的好处是事务管理不侵入业务逻辑,提高了代码的可读性和可维护性。
我们可以采用 @Transactional 注解来完成对事务的操作,其中使用了该注解之后就自动的开启我们的事务了,当被注解修饰的地方的代码顺利的执行完了之后那么就提交该事务,但是如果出现中途代码异常的话就会自动的回滚我们的事务。
需要注意的是,@Transactional
注解只能应用到 public 方法上,这是因为事务的代理机制是通过代理对象来调用的,而代理对象只能代理 public 方法。
Transactional中的异常
我们会遇到一种情况,那就我是在我们使用事务声明的时候如果代码中发生了异常此时如果我们的使用了try,catch来处理异常的话那么我们的事务就不会发生回滚。
想要解决上述的问题的话我们有两种方式:
我们手动的在try,catch中去抛出一个异常。
通过代码手动的去回滚: