今天面试官问我关于Spring中的事务知道吗?我也不敢托大,就说了一下用注解,还有事务强制回滚(防止物理异常:断电等)
现在来看看事务有哪些特性吧
1、传播性
不知道你考虑过没有,在自己做项目时用的是一个事务包含了执行体的全部,要不都执行,要不都回滚,但是我想在执行体里有两个处理逻辑A和B,A回滚了,但是B可以不回滚,想过没有?当时我想的是try嵌套,现在看人家都已经给你写好了,惭愧
传播性的含义(只是大概意思):事务嵌套时使用,就像上面说的那样,A和B分别为一个事务,是一起合并起来呢还是各是各的,还是一层合并到另一层一起提交或者回滚呢(上文用try我就当A是内层事务,B是外层事务)
Spring事务怎么分类型是根据属性来决定,对于我的项目我都是把事务放在service层里,也就是在service层放一个注解@Transactional
而根据属性的不同那事务的传播性也不一样。
那下面看看有哪些属性:总共有6种,每一种都可以说是一种机制
(1)PROPAGATION_REQUIRED
Spring默认的事务传播机制,如果外层有事务则当前事务加入到外层事务,一块提交一块回滚,如果没有那它就自己一个事务
(2)PROPAGATION_REQUIRES_NEW
每次新开启一个事务,同时把外层的事务挂起,当前新事物执行完毕后再恢复上层的事务,
(3)PROPAGATION_SUPPORTS
如果外层有事务则加入该事务,如果不存在也不会创建新事务,直接使用非事务方式执行,
(4)PROPAGATION_NOT_SUPPORTED
不支持事务,如果外层存在事务则挂起外层事务,然后执行当前逻辑
(5)PROPAGATION_NEVER
不支持事务,如果外层存在事务则直接抛出异常
IllegalTransactionStateException(“Existing transaction found for transaction marked with propagation ‘never’”)
(6)PROPAGATION_MANDATORY
只能在已经存在事务的方法中被调用,如果在不存在事务的方法中被调用,则抛出异常IllegalTransactionStateException(“No existing transaction found for transaction marked with propagation ‘mandatory’”);
(7)PROPAGATION_NESTED
保存状态保存点,当事务回滚到某一个保存点时,从而避免所有的嵌套事务回滚
对比一下上面的这些事务,这样也好记
(1)单独的,如果有外部事务就合并,没有自己开启一个事务
(2)(4)共同点:都是挂起外部事物,里面执行完再放下,区别:(2)新建一个事务执行,(4)不建事务执行
(3)(4)共同点:自己不创建事务,区别:(3)会合并到外部事务,(4)挂起外部事务
(5)(6)都会抛出异常,区别是一个是存在外部事务报,另一个是不存在外部事务调用报
(7)保存某一个状态点,可以让事务不全部回滚,避免嵌套事务全部回滚
2、隔离性
看到下面会很熟悉的,就是ACID
- 未提交读
- 已提交读
- 可重复度
- 串行化