事务边界应按业务原子性划分,每个业务动作(如“用户下单”)对应一个事务;避免跨库/服务操作破坏一致性,优先用最终一致性+补偿机制;须配套超时控制、日志追踪与对账兜底。

事务边界划分的核心是“一个业务操作对应一个事务”,不是按SQL语句数量,也不是按函数调用层次,而是看是否满足原子性需求:要么全部成功,要么全部回滚,中间状态对外不可见。
从业务用例出发识别事务边界
每个明确的业务动作(如“用户下单”“账户转账”“库存扣减并生成订单”)应封装为独立事务。不能把“查余额→校验→扣款→记日志→发消息”拆成多个事务,否则会出现余额已扣但订单未生成、或订单生成但扣款失败等不一致情况。
- 典型反例:在Web接口中,先执行UPDATE account SET balance = balance - 100 WHERE id = 1,再调用另一个服务扣库存,两个操作不在同一事务内 → 账户扣了但库存没扣,或反之
- 正确做法:把所有关联数据变更(含主库写、关联表更新、必要状态标记)放在同一个数据库事务内完成;跨系统操作(如发MQ、调第三方API)应放在事务提交后,通过可靠消息或本地消息表补偿
避免事务过长或嵌套导致的问题
事务持有数据库锁的时间越长,并发性能越差,死锁风险越高。尤其要警惕在事务中做耗时操作(如HTTP请求、文件读写、复杂计算)。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~