------首先事务分为本地事务和分布式事务
本地事务
通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败。
原子性:一系列操作整体不可拆分,要么都执行,要么都不执行。
一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态
隔离性:事务之间相互隔离, 指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
持久性:一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中
在springboot中使用
声明式事务
声明式事务的实现比较简单,只需要在方法上或类上添加 @Transactional 注解即可,当加入了 @Transactional 注解就可以实现在方法执行前,自动开启事务;在方法成功执行完,自动提交事务;如果方法在执行期间,出现了异常,那么它会自动回滚事务。 它的具体使用如下:
事务回滚
@Transactional默认只能回滚RuntimeException和RuntimeException下面的子类抛出的异常,不能回滚Exception异常;如果需要支持回滚Exception异常,需要显示的指明,如**@Transactional**(rollbackFor = Exception.class);
事务失效原因
(1)@Transactional注解未打在public方法上
(2)目标方法用final修饰
(3)同一个类中的方法直接内部调用
(4)事务方法所在的类未被Spring管理
(5)多线程调用
(6)自己吞了异常,忘记抛出了;或者抛出了非运行时异常,但又没有配置到注解上;因为Spring事务默认情况下只会回滚RuntimeException(运行时异常)和Error(错误);
分布式事务
直接基于MQ来实现事务。比如阿里的RocketMQ就支持消息事务。
A 系统先向 mq 发送一条 prepare 消息,如果 prepare 消息发送失败,则直接取消操作
如果消息发送成功,则执行本地事务
如果本地事务执行成功,则想 mq 发送一条 confirm 消息,如果发送失败,则发送回滚消息
B 系统定期消费 mq 中的 confirm 消息,执行本地事务,并发送 ack 消息。如果 B 系统中的本地事务失败,会一直不断重试,如果是业务失败,会向 A 系统发起回滚请求
mq 会定期轮询所有 prepared 消息调用系统 A 提供的接口查询消息的处理情况,如果该 prepare 消息本地事务处理成功,则重新发送 confirm 消息,否则直接回滚该消息
使用