一、本地事务
事务(Transaction)是访问并可能更新数据库中各项数据项的一个程序执行单元(unit)。 事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。
事务结束有两种,事务中的步骤全部成功执行时,提交事务。如果其中一个失败,那么将会发生回滚操作,并且撤销之前的所有操作。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
事务是恢复和并发控制的基本单位。
事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID。
————————————————
原文链接:https://blog.csdn.net/weixin_62993347/article/details/128932923
二、分布式事务
分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,再多个微服务中出现的事务,例如:
跨数据源的分布式事务
跨服务的分布式事务
综合情况
1、分布式事务案例
电商行业中比较常见的下单付款案例,包括下面几个行为:
创建新订单
扣减商品库存
从用户账户余额扣除金额
订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务,可以保证ACID原则。
但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是分布式系统下的事务了。
此时ACID难以满足,这是分布式事务要解决的问题
再提供的案例中演示分布式事务:
account-service:账户服务,负责管理用户的资金账户。提供扣减余额的接口
storage-service:库存服务,负责管理商品库存。提供扣减库存的接口
order-service:订单服务,负责管理订单。创建订单时,需要使用远程调用account-service和storage-service
启动nacos
startup.cmd -m standalone
启动微服务测试
测试发现,当库存不足时,如果余额已经扣减,并不会回滚,出现了分布式事务问题。
余额扣减,库存不动(因为已经超出扣减范围)