array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 今天来聊聊事务传播行为 - 爱码网

到底什么叫事务的传播行为呢?

俺是个粗人,那么俺就用最白话的语言来说说俺心目中的事务传播行为。

事务这个我在此博客的其他帖子中也有专门说过:通俗的理解就是,一个需要做多件事的一个任务。事务是具有原子性,同一个事务中,所有的事情要么都没做,要么都做完了。这样说就应该理解了事务,那么事务的传播行为就可以很好理解了。

 

 

用具体的业务场景,我们来讲讲。比如哈,

老王我准备去逛逛某宝,然后挑了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

相关文章: