日日行,不怕千万里
什么是 Spring 的事务传播机制?项目中遇到长事务怎么处理?相信这是大多数人面试时会被问到的高频问题,那今天就来聊聊这个问题。
事务
什么是事务?
事务这个词大家都不会陌生,甚至 ACID 背的滚瓜烂熟,被问到这个,心里一喜,心想这不是手到擒来吗?直接撞咱枪口上了。
接下来你了你的表演:
-
事务的特性
-
原子性:一个事务中的所有操作,要么全部成功,要么全部失败,没有中间状态。
-
一致性:事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态,这是事务追求的最终状态,可以说其他的三个特性都是为了保证事务的一致性。
-
隔离性:事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰,严格的隔离性对应了串行化执行,但是实际操作中很少会用到串行化的隔离级别,一般来说可以分两个方面来保证隔离性。
- A 事务写对 B 事务写的影响:通过锁来保证
- A 事务写对 B 事务读的影响:通过 MVCC 来保证
-
持久性:事务一旦提交,对数据库的影响应该是永久性的。
那你平时在项目中是如何使用到事务的?
哎呀,那这不又是正中下怀吗?
首先,Spring 对事务的支持建立在你所使用的数据库,如果你使用的是 mysql 数据库,恰好又是使用的 innodb 引擎,那么恭喜你,是支持事务的。那 Spring 对事物的支持一般有两种方式:
- 编程式事务管理:通过
TransactionTemplate
或者TransactionManager
手动管理事务,实际应用中很少使用,这不是本文的重点,就不在这里赘述。
其他情况
那么如果遇到其他情况,乖乖的来看你需要的是哪种 Spring 事务传播机制吧。
另:@Transactional 默认情况下,只回滚 RuntimeException 哦。
后记
你不可能真想把这玩意全背下来吧,退一万步讲,就算你全背下来了,面试官会不知道你是背的?
面试官内心 OS: 这能全知道?肯定这小子是个卷王,八股文背的这么溜,要是招进来,还不得把我也卷出去?
这些文章我有空会给大家做一个整理,到时候给大家放在一个地方,如果有疑惑或者问题,欢迎指出或者私信我哦。
同时也希望大家可以关注我的公众号【类似程序员】,会定期与大家分享我的一些想法与学习感悟,谢谢各位!
[[TagFolder/#简历面试/框架篇讲义#4. Spring 事务失效]]