为什么在service层不允许有事务?

文档问题 · fec_chaser · 于 5年前 发布 · 5516 次阅读

看了cart模块的代码。个人觉得里面有些业务的操作需要用到事务。比如添加或者删除购物车的时候,个人觉得更新购物车信息的时候用上事务会更加完美一点。但是看到注释中有说明在service层不允许有事务,需要在外围使用事务。为什么?

共收到 4 条回复
Terry#15年前 0 个赞

1.对于一些不需要强一致性的部分,也就是允许出错的地方,或者说哪一点丝毫的出错不会带来多大影响的地方, 可以不使用事务,譬如购物车信息,如果某次更新cart信息,正好数据库宕机了,用户下次把产品加入购物车的时候,或者删除购物车数据的时候,会重新计算出来,数据会准确,而且现在的云数据库很稳定,很少出这种情况,因此购物车更新的一些多表的操作(购物车有2个表),在外层也没有加事务,即使出错,影响几乎为0.

2.service里面的方法,都是在外层调用的,如果里面的方法加了事务,那么这个方法调用的其他的方法里面,可能存在事务service方法,因此就会传多个事务嵌套,第一个事务还没有提交,又开始开启第二个事务,第三个事务,这会出问题的,另外services层是一个公用层,对于某个方法,后端需要事务,可能前端不需要事务,console可能又需要,而block是各个app入口独有的, 因此只能在block层,也就是外层加事务。

3.对于order表,当生成订单,需要 扣除库存,优惠券使用信息等,这些需要100%强一致的场景都是有事务的

4.可能出现这种问题,block调用的某个方法,只有部分需要事务,另外的部分不需要,那么,你可以把这个方法拆成几个方法,在外层调用。

5.另外,对于mongodb,是没有多表事务的。产品表在mongodb中,但是产品的库存表是在mysql里面的, 这样生成订单的时候,就可以通过mysql的事务机制,扣除库存,保持强一致。 可以参看:https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/modules/Checkout/block/onepage/Placeorder.php 74行

fec_chaser#25年前 0 个赞

谢谢大神的解答。我也去了解了一下关于service层的知识。另外:方便写一个关于架构层面的教程或者fec项目的整体规划么

fec_chaser#45年前 0 个赞

谢谢@Terry #3楼

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics