在一个微服务系统中,通过聚合层调用业务层,聚合层只负责简单的调用,业务层内部是带数据库事务的,现有A,B两个业务场景,
A业务里订单与客户是一对一的,聚合层直接调用A业务的业务层处理,调用前会在聚合层根据客户账户ID锁定客户账户,以便确保在操作期间账户的金额变动不会被并发.
类似 lock(customerId)
{
...
}
B业务里会包含多个订单,它们可能来自不同客户,有点类似打包之后一起处理(业务主表一条数据对应业务明细表里多条订单),当审核主数据时,要求明细数据一起处理成功或失败.
在聚合层调用B业务时,该如何锁定比较好呢?
如果foreach 明细按客户ID分组后逐个锁定来处理的话,
可能会导致某个客户的失败,另一个客户的成功 这种情况,
这种情况怎么解决比较好呢?
这是事务的问题,业务B中把更新主表和各个明细表的数据库操作放到一个事务中。
任何一条更新失败就回滚整个事务