今天来聊聊事务传播行为
到底什么叫事务的传播行为呢?
俺是个粗人,那么俺就用最白话的语言来说说俺心目中的事务传播行为。
事务这个我在此博客的其他帖子中也有专门说过:通俗的理解就是,一个需要做多件事的一个任务。事务是具有原子性,同一个事务中,所有的事情要么都没做,要么都做完了。这样说就应该理解了事务,那么事务的传播行为就可以很好理解了。
用具体的业务场景,我们来讲讲。比如哈,
老王我准备去逛逛某宝,然后挑了1个足球,2个篮球,3个羽毛球拍(是的,我开文体店的。),都在购物车静候我统一下单付款了。
但是我精心计算,不行,我支付宝账户只有5块钱,买这些东西好像不够(足球单价:2块,篮球单价:3块,羽毛球单价:4块)。
我的妈,我试了一下,我把这3样东西全部勾上,然后一键下单付款的时候,它提示我余额不足,然后给全部打回来了。。
诶,我就开始思考了,老马不会做生意啊,我钱不够,但是又不是没有钱,我有5块,按道理来说,你内部其实是一样商品一样商品的付款的。我先买了一个足球:2块,然后扣完,我还剩3元;然后我再买2个篮球:6块,不够钱,然后再提示余额不足就是了嘛。就因为我不够买全部的,你就一样都不卖给我了?这还(让天底下没有难做的生意?)
那么站在实际开发的角度,我上述的可以分析一下了
对于商品下单购买这种需求,通常来说,我们都需要对每个环节加上事务控制的,保证交易的正常运行。
对于我一键下单,那么就是向后台提交了一个请求,然后这个请求方法是加上事务控制的,然后在这个事务内部分为
足球扣款、篮球扣款、篮球扣款、羽毛球扣款、羽毛球扣款、羽毛球扣款。那么这5个步骤都会再细分为5个方法执行流程。那么5个方法,每个方法也都会有对应的事务控制。控制着,我支付宝账户扣款、卖家支付宝账户增款等。然后就是考虑事务的控制了。
那么这个时候,它在篮球扣款任务阶段,发现第二个篮球扣款的时候,余额不足了。那么就需要事务回滚了,第一个篮球扣的款全部撤销。这个时候有两种情况了
(1)如果足球扣款、篮球扣款、羽毛球扣款是事务A、那么如果篮球的每一个扣款也加入了事务A,那么如果第二个篮球扣款失败了,发生异常情况,那么事务A就会回滚。从而导致所有的商品都无法下单成功了。
(2)如果足球扣款、篮球扣款、羽毛球扣款是事务A,那么如果篮球的每一个扣款事情都自己创建了一个事务B、C、D....。那么这个时候,事务B成功了,事务C失败了,并不会影响事务B的成功执行。这个时候就是老马发现你就5块钱,就按顺序来,卖给你5块钱最大买到的东西。
那么肯定还有其他的处理方案。老马做生意肯定有很多种套路的。
那么这也是事务的传播性的一个说法。事务A底下有多个事务,那么每个事务的都是独立的,那么我们再用专业的说法聊聊事务的传播性行为。
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。比如:方法继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播新闻可以由传播属性制定。Spring中定义了7中传播行为。
注意:事务传播属性可以在@Transactional注解的propagation属性中定义。默认的事务传播属性为REQUIRE
D