关于事务,之前只是大概知道什么原子性,回滚等概念,因为在项目实践中几乎不会手动去控制事务,所以对其的理解一直很浅,直到之前排查问题的时候才进一步地了解了下。
在实际项目中,利用Spring管理事务的时候可以利用配置文件声明的方式来控制事务传播属性,例如下面几个:
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
实际上一共有7中配置,各自配置如下事务属性详解:
PS:注意!这个配置将影响数据存储,必须根据情况选择。
下面来结合实际例子理解一下其中的意思:
假设一个场景:我们在methodA中开启了一个事务A,并且在这个事务A中对USER表进行了数据的修改,比如把USER.NAME从JONZ改成了TOM,然后又调用了methodB对USER表的数据进行查询,结果会是怎样呢?
1、如果methodA和methodB的传播属性都是配置成PROPAGATION_REQUIRED
那么!
在methodB中查询到的USER.NAME就会是TOM,也就是在methodA中进行修改后的数据。(未提交事务之前的数据是保存在缓存里的?)
2、如果methodA和methodB的传播属性都是配置成PROPAGATION_REQUIRES_NEW,
或者methodA是PROPAGATION_REQUIRED而methodB是PROPAGATION_REQUIRES_NEW
那么!
在methodB中查询到的USER.NAME将会是JONZ,
因为methodB开启了一个新的事务,然后methodA的事务被挂起未进行commit,导致数据库里的USER.NAME还未进行更新,也就会导致mwthodB查到的会是旧数据。
emmmm因为网上大部分讲事务传播的文章都是在讲事务回滚的,这边我就不多说了,本文摘自平常的工作笔记,有错误的地方帮忙留言指正哈~
PPPPPS:配图啥的还不太会弄,随便用的电脑壁纸,莫介意。
领取专属 10元无门槛券
私享最新 技术干货