做网站可视化,广州seo培训,小程序开发报价方案,wordpress做服务器作者简介#xff1a;大家好#xff0c;我是smart哥#xff0c;前中兴通讯、美团架构师#xff0c;现某互联网公司CTO 联系qq#xff1a;184480602#xff0c;加我进群#xff0c;大家一起学习#xff0c;一起进步#xff0c;一起对抗互联网寒冬 学习必须往深处挖… 作者简介大家好我是smart哥前中兴通讯、美团架构师现某互联网公司CTO 联系qq184480602加我进群大家一起学习一起进步一起对抗互联网寒冬 学习必须往深处挖挖的越深基础越扎实
阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析阶段5、深入jvm源码解析
事务的难点在哪
之前分享过一个观点设计模式最难的不是代码、也不是设计思想而是如何准确判断每种设计模式的使用时机。一些人可能对23种设计模式如数家珍、倒背如流却常常在阴沟里翻船不知不觉就用了各种if else到处打补丁。 同理事务本身其实也不难无论本地事务还是分布式事务业界都有成熟的解决方案。事务最大的问题也在使用时机
人们往往不知道此处需要事务 佣金错误案例
日常开发时我们很容易写出下面的代码
Transactional(rollbackFor Exception.class)
public void execute() {updateUserPoint();updateUserLevel();
}
由于用户积分和用户等级需要满足“要么同时成功要么同时失败”的特性所以加上了Transactional保证事务。很多人都十分清楚Transactional什么情况下会失效但事务往往总在你意想不到的地方失效。 请大家观察下面这段代码看看有什么问题代码做了适当简化
// 根据订单号获取佣金
public ListOrderCmsDO getCmsList(String outerOid) {if (StringUtil.isEmpty(outerOid)) {return Collections.emptyList();}ListOrderCmsDO cmsList;try {// 构造请求参数CmsCalculationReqBO reqBO generateParam(outerOid);log.info(CmsCalculateBiz.getCmsList, outerOid:{}, reqBO:{}, outerOid, reqBO);// 计算佣金cmsList cmsCalculatorSelector.select(reqBO).calculateAllCms(reqBO);log.info(CmsCalculateBiz.getCmsList, outerOid:{}, reqBO:{}, cmsList:{}, outerOid, reqBO, cmsList);} catch (Exception e) {log.info(CmsCalculateBiz.getCmsList, request error, outerOid:{}, outerOid, e);}return cmsList;
}// 计算佣金每计算一种类型的cms就往cmsList中add
public ListOrderCmsDO calculateAllCms(CmsCalculationReqBO reqBO) {// ...CmsCalculateContextBO contextBO generateCmsContextBO(reqBO);/*** 注意以下执行顺序不能改变** 计算V0 分享奖励* 计算V1 自售或者分享奖励* 计算V2 平台补贴* 计算V2 自售补贴* 计算V2 自售或者分享奖励* 计算V2 星火奖励* 计算V3 平台补贴* 计算V3 自售补贴* 计算V3 自售或者分享奖励* 计算V3 星火奖励*/calculateV0Profit(reqBO, contextBO);calculateV1Profit(reqBO, contextBO);calculateV2SubsidyProfit(reqBO, contextBO);calculateV2Profit(reqBO, contextBO);calculateV2Spark(reqBO, contextBO);calculateV3SubsidyProfit(reqBO, contextBO);calculateV3Profit(reqBO, contextBO);calculateV3Spark(reqBO, contextBO);return contextBO.getCmsList();
}
大致逻辑是 上游方法依赖getCmsList()然后批量插入用户下单所得佣金具体佣金计算逻辑在calculateAllCms()。一个用户下单所得佣金比较复杂最终返回的cmsList类似这种
[{bizId: xxx,cmsAmt: 1,cmsDesc: V2平台补贴,outerOid: xxx,uid: 10086},{bizId: xxx,cmsAmt: 15,cmsDesc: V2分享奖励,outerOid: xxx,uid: 10086},{// 本订单其他类型佣金...}
] 一个用户它的佣金假设有A、B、C三种类型要么同时插入3种佣金要么都不插入后期有问题直接重跑即可最怕的就是那种只插入一半的情况修复很麻烦需要删除原有的甚至还要回滚由佣金引发的一系列操作。 而上面的代码就可能导致部分佣金写入的问题 假设calculateAllCms()中需要计算3类佣金A、B都没问题C类佣金计算失败抛异常那么就会进入上面的catch代码块。然而此时cmsList中已经有A、B类佣金代码继续往下走就会return cmsList返回了不完整的佣金列表最终数据库插入的就是不完整的佣金缺少C类佣金。
catch里面可以直接返回emptyList不插入总比插入不完整的好后面再补就是了。 小结
分布式应用中也很容易因为疏忽导致数据不一致比如我们往往会引入Manager层为的是对其他Service的API接口做一层封装
Slf4j
Component
public class MemberServiceManager {Resourceprivate MemberDirectRecordService memberDirectRecordService;public MemberDirectRecordTO getDirectRecord(Long uid) {if (Validator.isNotId(uid)) {return null;}try {ServiceResultTOMemberDirectRecordTO resultTO memberDirectRecordService.getDirectRecord(uid);if (Validator.isNullOrEmpty(resultTO) || Validator.isFalse(resultTO.getSuccess())) {return null;}return resultTO.getData();} catch (Exception e) {log.error(getDirectRecord, error, uid:{}, uid, e);}return null;}}
上面这种写法由于异常被吞了调用者往往很难区分到底是远程调用超时导致null还是接口查询本身为null。如果调用者的逻辑是
if(result不为null){ // 本意是不为null进行一些操作do something;
}
但如果这个“null”仅仅是因为RPC远程调用失败导致的而不是对应的数据真的为null本次操作就会被遗漏效果和上面的佣金计算是一样的。 这些其实都是事务范畴try catch处理不当容易导致问题被忽略最终发生数据不一致的问题。 文章转载自: http://www.morning.jjnql.cn.gov.cn.jjnql.cn http://www.morning.prfrb.cn.gov.cn.prfrb.cn http://www.morning.rgnq.cn.gov.cn.rgnq.cn http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.jglqn.cn.gov.cn.jglqn.cn http://www.morning.cfynn.cn.gov.cn.cfynn.cn http://www.morning.zglrl.cn.gov.cn.zglrl.cn http://www.morning.gpfuxiu.cn.gov.cn.gpfuxiu.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.mpflb.cn.gov.cn.mpflb.cn http://www.morning.zpkfb.cn.gov.cn.zpkfb.cn http://www.morning.qpnmd.cn.gov.cn.qpnmd.cn http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.ntzfl.cn.gov.cn.ntzfl.cn http://www.morning.nqypf.cn.gov.cn.nqypf.cn http://www.morning.dspqc.cn.gov.cn.dspqc.cn http://www.morning.hbqfh.cn.gov.cn.hbqfh.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.qlznd.cn.gov.cn.qlznd.cn http://www.morning.lxyyp.cn.gov.cn.lxyyp.cn http://www.morning.jbfjp.cn.gov.cn.jbfjp.cn http://www.morning.pbsqr.cn.gov.cn.pbsqr.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.jjhng.cn.gov.cn.jjhng.cn http://www.morning.zhishizf.cn.gov.cn.zhishizf.cn http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.pbsfq.cn.gov.cn.pbsfq.cn http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn http://www.morning.zbkdm.cn.gov.cn.zbkdm.cn http://www.morning.jpjpb.cn.gov.cn.jpjpb.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.dsmwy.cn.gov.cn.dsmwy.cn http://www.morning.ttfh.cn.gov.cn.ttfh.cn http://www.morning.wyjpt.cn.gov.cn.wyjpt.cn http://www.morning.lpsjs.com.gov.cn.lpsjs.com http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn http://www.morning.jfxth.cn.gov.cn.jfxth.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.banzou2034.cn.gov.cn.banzou2034.cn http://www.morning.jbtzx.cn.gov.cn.jbtzx.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.lizimc.com.gov.cn.lizimc.com http://www.morning.mtdfn.cn.gov.cn.mtdfn.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.fnczn.cn.gov.cn.fnczn.cn http://www.morning.fpzz1.cn.gov.cn.fpzz1.cn http://www.morning.ygrkg.cn.gov.cn.ygrkg.cn http://www.morning.jhrqn.cn.gov.cn.jhrqn.cn http://www.morning.tkyxl.cn.gov.cn.tkyxl.cn http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn http://www.morning.mbfkt.cn.gov.cn.mbfkt.cn http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.qgghj.cn.gov.cn.qgghj.cn http://www.morning.qrpdk.cn.gov.cn.qrpdk.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.kjyqr.cn.gov.cn.kjyqr.cn http://www.morning.cjwkf.cn.gov.cn.cjwkf.cn http://www.morning.yjtnc.cn.gov.cn.yjtnc.cn http://www.morning.pkrtz.cn.gov.cn.pkrtz.cn http://www.morning.pngfx.cn.gov.cn.pngfx.cn http://www.morning.lhrwy.cn.gov.cn.lhrwy.cn http://www.morning.zpzys.cn.gov.cn.zpzys.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.qgmwt.cn.gov.cn.qgmwt.cn http://www.morning.smkxm.cn.gov.cn.smkxm.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.trrd.cn.gov.cn.trrd.cn