一、什么是事务
事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性.
事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用
事务的四个关键属性(ACID)
- 原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.
- 一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中.
- 隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.
- 持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中.
二、事务的流程
底层原理:
spring实现事务:
基于注解的spring事务流程:
三、spring事务的解读
PlatformTransactionManager:事务平台管理器。
spring管理事务时,必须使用平台事务管理器,它是一个接口,相当于定义一个spring使用事务的规范,也就是如果你想用spring来帮你管理事务,那么就必须遵循这个规范,spring也帮我们实现了一些常用的技术所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他们都是实现spring中的PlatformTransactionManager接口的。
jdbc事务管理器:DataSourceTransactionManager
hibernate事务管理器:HibernateTransactionManager
PlatformTransactionManager是一个接口,那我们看它定义了哪些方法供我们使用的。
TransactionStatus getTransaction(TransactionDefinition);
获取事务,参数TransactionDefinition(事务详情),该参数是需要我们配置的,通过我们配置的内容才能知道事务如何去处理。这个下面会详解
commit(TransactionStatus);
根据状态来提交事务的操作
rollback(TransactionStatus);
根据状态来回滚事务的操作
TransactionStatus
spring使用管理器,通过状态对事务进行管理(操作),我们不必关心这个,因为这是spring内部操作的事情,但是我们可以了解一下有哪些方法
TransactionDefinition
spring管理器必须通过"事务详情"的设置,获取相应的事务,从而进行事务管理。这里这个很重要,我们需要配置这个
设置4个隔离级别就不用说了把,跟上面我们说的是一样的。解决隔离问题的四种级别。
传播行为:一个业务A,一个业务B,AB如何共享事务,不同传播行为共享方案不同。
什么意思呢?比如业务A为银行转账的业务。 业务B为转完账发短信的业务,平常我们是转完钱,那么我们就需要收到短信说我们的账户上被转走多少钱,而收钱的那一方则需要收到短信说账户被转进多少钱,那么这两个业务是使用同一个事务呢?还是分别使用不同的事务,也就是如果是使用同一个事务的话,我们转钱成功了代表业务A成功了,但是业务B发送短信时出现问题,则说明该事务失败,那么刚才转的钱就算不成功,需要回滚,但是实际生活中,是不能这样的,转钱成功了,短信没发送成功,那么短信在重新发送一次即可。不需要让业务A重新在操作一遍。这就是业务A和业务B共享事务的解决方法,让他们两个使用各自的事务。而传播行为就是提供这样的共享方案的属性。
传播行为方案
1.PROPAGATION_REQUIRED ,required ,必须使用事务 (默认值)
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B将创建一个新事务。
2.PROPAGATION_SUPPORTS,supports ,支持事务
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B 将以非事务执行。
3.PROPAGATION_MANDATORY,mandatory 强制
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B 抛异常
4.PROPAGATION_REQUIRES_NEW , requires_new ,必须是新事务
A 如果使用事务,B将A的事务挂起,再创建新的。
A 如果没有事务,B将创建一个新事务
5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支持事务
A 如果使用事务,B将A的事务挂起,以非事务执行
A 如果没有事务,B 以非事务执行
6.PROPAGATION_NEVER,never 从不使用
A 如果使用事务,B 抛异常
A 如果没有事务,B 以非事务执行
7.PROPAGATION_NESTED nested 嵌套
A 如果使用事务,B将采用嵌套事务。
嵌套事务底层使用Savepoint 设置保存点,将一个事务,相当于拆分多个。比如业务A为AB两个曹祖,业务B为CD两个操作,业务AB使用同一个事务,在AB (POINT) CD,当业务B失败时,回滚到POINT处,从而业务A还是成功的,就是保持点的操作。底层使用嵌套try方式