友情链接:https://www.cnblogs.com/Agui520/p/11187972.html
https://blog.csdn.net/fd2025/article/details/79863390
以支付、电商下单为例子。一个电商系统包含了好几大类模块,就比如有用户模块、商品模块、库存模块、订单模块、支付模块、物流模块,活动模块等,以下就先列举几个最基础常见的模块(用户模块、商品模块、库存模块、订单模块、支付模块)。
用户流程如下:
如果系统规模较小,数据表都在一个数据库实例上,项目服务端也都在同一个项目,那上面的问题基本不是问题,直接用本地事务(一致性,原子性、隔离性、持久性)解决,比如支付转账(A->B)模块肯定会出现A账户减少,B账户增加,程序操作加个事务管理就解决。但是如果系统规模较大,比如支付宝账户表和余额宝账户表显然不会在同一个数据库实例上,他们往往分布在不同的物理节点上,又比如商品模块,订单模块不会在同一个数据库中或是在同一个项目中,这时本地事务就已经失去用武之地了。
支付宝转1万元到余额宝,如果支付宝扣除1万后,如果系统挂掉了,余额宝并没有增加1万,数据出现不一致情况。
电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须 减1,怎么保证??在 搜索广告系统中,当用户点击某广告后,除了在点击事件表中 增加一条
记录外 ,还得去商家账户表中找到这个商家扣除广告费吧,怎么保证??
不拆分服务最常见的解决方案:
本地事务:
Begin transaction
update A set amount = amount - 10000 where userId = 1
update B set amount = amount + 10000 where userId = 1
End transaction
commit;
原文:https://www.cnblogs.com/zjtao/p/11199533.html