Spring中事务的传播性(重点)和隔离性(这个很熟悉,了解一下)

今天面试官问我关于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

  1. 未提交读
  2. 已提交读
  3. 可重复度
  4. 串行化

详细请看这MySql的MyIsam和InnoDb两个搜索引擎的区别与联系

发布了213 篇原创文章 · 获赞 22 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43113679/article/details/100336288