多项目时,事务该怎么管理
现有项目分为了三个独立的工程:分别是接口、后台管理、支付相关。
每一个都是一个web工程,单独启动,数据库使用的是同一个。
定时任务是放在后台管理的工程内,但是定时任务和接口工程可能会同时操作一条数据,出现问题,spring的事务只能在一个工程内解决,这种多项目的情况该如何解决事务问题呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
分布式不光是指数据库的分布式吧,程序上也有“分布式”
回复
无论是分布式数据库还是分布式应用,只会把问题复杂化,数据库加锁就可以解决。
回复
@BoXuan : 请问你如何用分布式解决上面的问题呢?
目前常见的分布式包括分布式存储、分布式计算,分布式存储跟数据库的多少或者磁盘分件存储有关系,而它这种不存在分布式存储,但将业务分到三个项目上,整的来说是三个分开的业务流程最终汇整到一个大的业务上,应该是属于分布式计算的范畴。
我就郁闷了,同一个数据库,怎么就扯到分布式那去了。
感谢回答。 您介绍了分布式,但是我提出的问题应该和分布式关系不大吧
分布式是把项目整体分割成独立的一部分,可以简单理解为串联电路,其中一个损坏,无特殊处理方案的情况下整个分布式链路报废。集群是把项目整体分布在可独立运行整个业务的服务器上,简单理解为并联电路,其中一个损坏,不影响其它服务。负载均衡是调度协调集群中的服务器个体承载量的。
大型网络服务,会把项目做集群部署,而项目又做分布式多分结构(比如很多项目都有中间件),每个分布式节点又可以做集群,理论上可以拓展得非常广。
嗯,说的是,我理解的分布式有问题,这种多项目的结构也是分布式,那怎么解决呢
回复
网上搜索“分布式事务”,有好几种方案的,也有用redis做分布式事务锁的。
回复
@BoXuan : 分布式事务锁用什么做的?什么框架? (
回复
@BoXuan : 嗯,但过于麻烦了,我觉得我这种情况,数据库加锁应该就可以解决了
这就是分布式,一楼的答案正解。
分布式事务锁用什么做的?什么框架?
分布式事务锁
那您说,我这种问题,该怎么去规避呢,我能想到的只有锁了,直接加行锁(乐观/悲观)
回复
打个比方,客户支付完成下单这一步,需求是客户要么支付成功,要么支付失败,不能没有支付却显示支付成功,或者支付成功却显示支付失败。假设有个支付订单表,客户id:1有一条未支付记录,现在客户开始支付,
回复
方案一,订单表有一列版本号,客户下单时首先拉取账单记录,然后支付时拿着账单id和版本号去做update修改状态(update……where orderid=?and version=?),后台获取支付结果,返回0支付失败,前台通知客户支付失败,返回1,支付成功,前台通知支付成功,若发生失败,中间涉及三方的话,金额原路返回
回复
方案二,客户支付直接update数据库,update成功,则直接放回,若失败,将此订单记录到异常订单表,有个定时,定时读取异常订单表,校对信息,若无误修改订单状态,若错误,重置订单,涉及金额,原路返回,若无法判断,转存到人工复审订单表
使用锁会严重影响系统性能,尤其分布式锁,目前技术不成熟,坑比较多,一般都是通过业务去规避事物的问题