2023年11月29日发(作者:)

@Transactional注解详解

⾸先,要学习这个注解就必须要先了解什么是事务。它是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏,在业务上我们可能会有⼤量插⼊

或修改的情况,如果某⼀操作次发⽣报错,⽐如有唯⼀索引的字段插⼊重复的数据,那么系统就会发⽣回滚,本次所有的插⼊或修改都不会

存在了。

ACID 事务的特性

1. 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤。

前⾯说过事务是⼀组操作组成的,我们把它想象成在[冰箱取⼗瓶饮料],它可以分为⼏个步骤:打开冰箱、取饮料*10、关闭冰箱,这

些步骤就是⼀组操作,在事务下要么全部完成,要么全部不完成,如果说打开冰箱发现取到第五瓶饮料之后冰箱空了,此时你就捕获

了⼀个异常,事物就需要回滚,你得归还你⼿上的所有饮料,冰箱也就像没有打开过⼀样。

2. ⼀致性: 执⾏事务前后,数据保持⼀致。

⾸先事物特性这段是我copy的,这⾥我有点异议,对于事物的⼀致性,我的理解是⼀组操作执⾏的最终结果和你的期望结果是⼀致

的。

3. 隔离性: 并发访问数据库时,⼀个⽤户的事物不被其他事物所⼲扰,各并发事务之间数据库是独⽴的。

4. 持久性: ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发⽣故障也不应该对其有任何影响。

事务的传播⾏为,就是定义在存在多个事务同时存在的时候,应该如何处理这些事务的⾏为。通俗地讲就是有⼀个⽅法A和⽅法B,⽅

法A存在事务,那么在⽅法A中调⽤⽅法B,⽅法B是否存在事务就⽤这个属性定义。

1. ED 业务⽅法需要在⼀个事务中运⾏,如果⽅法运⾏时,已处在⼀个事务中,那么就加⼊该事务,否则⾃⼰创建⼀个新的事

务。这是spring默认的传播⾏为。

2. _SUPPORTED:声明⽅法不需要事务。如果⽅法没有关联到⼀个事务,容器不会为他开启事务,如果⽅法在⼀个事务中被调

⽤,该事务会被挂起,调⽤结束后,原先的事务会恢复执⾏。

3. ES_NEW:不管是否存在事务,该⽅法总会为⾃⼰发起⼀个新的事务。如果⽅法已经运⾏在⼀个事务中,则原有事务挂

起,新的事务被创建。

4. ORY:该⽅法只能在⼀个已经存在的事务中执⾏,业务⽅法不能发起⾃⼰的事务。如果在没有事务的环境下被调⽤,容器

抛出异常。

5. TS:该⽅法在某个事务范围内被调⽤,则⽅法成为该事务的⼀部分。如果⽅法在该事务范围外被调⽤,该⽅法就在没有事

指定哪些不会导致事务回滚。

失效场景

1. 异常被捕获

在⽅法中使⽤ try{}catch()进⾏了异常的捕获,会导致失误失效。