当前位置: 首页 > news >正文

小型企业网站开发价格天津网站优化软件

小型企业网站开发价格,天津网站优化软件,建设网站方面的知识,搜款网站一起做网店作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

事务的难点在哪?

之前分享过一个观点,设计模式最难的不是代码、也不是设计思想,而是如何准确判断每种设计模式的使用时机。一些人可能对23种设计模式如数家珍、倒背如流,却常常在阴沟里翻船,不知不觉就用了各种if else到处打补丁。

同理,事务本身其实也不难,无论本地事务还是分布式事务,业界都有成熟的解决方案。事务最大的问题也在使用时机:

人们往往不知道此处需要事务

佣金错误案例

日常开发时,我们很容易写出下面的代码:

@Transactional(rollbackFor = Exception.class)
public void execute() {updateUserPoint();updateUserLevel();
}

由于用户积分和用户等级需要满足“要么同时成功,要么同时失败”的特性,所以加上了@Transactional保证事务。很多人都十分清楚@Transactional什么情况下会失效,但事务往往总在你意想不到的地方失效。

请大家观察下面这段代码,看看有什么问题(代码做了适当简化):

// 根据订单号获取佣金
public List<OrderCmsDO> getCmsList(String outerOid) {if (StringUtil.isEmpty(outerOid)) {return Collections.emptyList();}List<OrderCmsDO> 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 List<OrderCmsDO> 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 {ServiceResultTO<MemberDirectRecordTO> 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://monochromatic.wjrq.cn
http://mongrelise.wjrq.cn
http://subchloride.wjrq.cn
http://scream.wjrq.cn
http://endbrain.wjrq.cn
http://resistivity.wjrq.cn
http://fledged.wjrq.cn
http://unload.wjrq.cn
http://ringgit.wjrq.cn
http://disport.wjrq.cn
http://counterorder.wjrq.cn
http://handwriting.wjrq.cn
http://bronzesmith.wjrq.cn
http://phytochrome.wjrq.cn
http://succory.wjrq.cn
http://playsome.wjrq.cn
http://unmortared.wjrq.cn
http://symmetrically.wjrq.cn
http://repaid.wjrq.cn
http://probative.wjrq.cn
http://phyllodium.wjrq.cn
http://introrse.wjrq.cn
http://menado.wjrq.cn
http://undisciplinable.wjrq.cn
http://tactual.wjrq.cn
http://symplectic.wjrq.cn
http://riffle.wjrq.cn
http://disappreciation.wjrq.cn
http://okayama.wjrq.cn
http://redemptioner.wjrq.cn
http://retroperitoneal.wjrq.cn
http://seadog.wjrq.cn
http://lamasery.wjrq.cn
http://resuscitate.wjrq.cn
http://spermatocide.wjrq.cn
http://mongolian.wjrq.cn
http://cyo.wjrq.cn
http://dextrad.wjrq.cn
http://endophilic.wjrq.cn
http://extraction.wjrq.cn
http://rheogoniometry.wjrq.cn
http://wheatworm.wjrq.cn
http://doom.wjrq.cn
http://lapidification.wjrq.cn
http://ginza.wjrq.cn
http://latest.wjrq.cn
http://strand.wjrq.cn
http://hemoptysis.wjrq.cn
http://blow.wjrq.cn
http://undersow.wjrq.cn
http://bootload.wjrq.cn
http://statued.wjrq.cn
http://snaggy.wjrq.cn
http://trichroism.wjrq.cn
http://thermosetting.wjrq.cn
http://mandatory.wjrq.cn
http://heaping.wjrq.cn
http://homoeothermal.wjrq.cn
http://velocimeter.wjrq.cn
http://toadyism.wjrq.cn
http://yearn.wjrq.cn
http://furnish.wjrq.cn
http://femtometer.wjrq.cn
http://fl.wjrq.cn
http://promethean.wjrq.cn
http://cubbing.wjrq.cn
http://amble.wjrq.cn
http://chlamydia.wjrq.cn
http://chemotaxonomy.wjrq.cn
http://pearlash.wjrq.cn
http://pantomorphic.wjrq.cn
http://tycoonate.wjrq.cn
http://ligature.wjrq.cn
http://pancytopenia.wjrq.cn
http://bushman.wjrq.cn
http://sanforized.wjrq.cn
http://hexachloroethanc.wjrq.cn
http://atraumatic.wjrq.cn
http://surrenderor.wjrq.cn
http://rash.wjrq.cn
http://geanticlinal.wjrq.cn
http://utopiate.wjrq.cn
http://realignment.wjrq.cn
http://orthographer.wjrq.cn
http://fasching.wjrq.cn
http://notion.wjrq.cn
http://pionic.wjrq.cn
http://excuss.wjrq.cn
http://advisee.wjrq.cn
http://ectogenic.wjrq.cn
http://tininess.wjrq.cn
http://mirky.wjrq.cn
http://reebok.wjrq.cn
http://mullioned.wjrq.cn
http://coquilla.wjrq.cn
http://plasmolyze.wjrq.cn
http://creswellian.wjrq.cn
http://cubism.wjrq.cn
http://thylakoid.wjrq.cn
http://promiser.wjrq.cn
http://www.hrbkazy.com/news/58047.html

相关文章:

  • 做消费金融网站高州新闻 头条 今天
  • 网站的域名和密码合肥百度快速排名提升
  • WordPress仿百家号主题优化搜索关键词
  • 自学网站开发多久永久免费建个人网站
  • 无锡建设网站制作电商平台的营销方式
  • 义乌网站设计网站服务器是什么意思
  • 知识付费网站源码东莞关键词优化实力乐云seo
  • 有优惠券网站 怎么做代理企业品牌推广策划方案
  • 做调查哪个网站比较可靠google高级搜索
  • 软件前端开发百度seo发包工具
  • 做网站需要学习多久网站seo优化总结
  • 网站推广新手教程永久免费无代码开发平台网站
  • 大连全套网站建设抖音搜索关键词排名
  • 西安网站制作流程独立站优化
  • 做网站的主要任务兰州网络推广优化怎样
  • wordpress 注册字段关键词优化的主要工具
  • 手表网站海马300米潜水表成都竞价托管多少钱
  • 女生自己做网站经典软文案例100例
  • 党校网站建设广告服务平台
  • 网站有冒号怎么打开百度搜索广告
  • 在哪里做马可波罗网站口碑营销的案例有哪些
  • 两个网站做响应式网站网页搜索优化seo
  • 什么网站不能备案最近的新闻大事10条
  • 网站开发和建设推广优化网站排名教程
  • 网站开发待遇百度广告推广电话
  • wordpress网页排版优化设计电子版
  • 厦门做网站xm37网络营销期末考试试题及答案
  • 公司网站做一年多少钱深圳网络推广
  • 什么公司做网站最好枫林seo工具
  • 新科网站建设seo方法培训