专栏名称: 脚本之家
脚本之家(jb51.net)是国内专业的网站建设资源、脚本编程学习类网站,以后将为大家分享更多有用的信息,希望大家多多支持宣传。
目录
相关文章推荐
漳视新闻  ·  福建一医院被吊销许可证! ·  昨天  
新华社  ·  北大清华回应校内河湖水被标价售卖 ·  昨天  
福建司法  ·  一天打卡六次!不愿意就自行离职? ·  2 天前  
51好读  ›  专栏  ›  脚本之家

面试官:使用 MySQL 时如果发现数据不一致了,可能是什么原因?

脚本之家  · 公众号  ·  · 2025-06-09 17:00

正文

请到「今天看啥」查看全文


1.1 单体事务

事务失效是造成数据不一致的一种常见情况。举一个例子,客户下订单后,订单表插入一条记录,插入成功,账户表扣减金额,但扣减金额失败。如下图:

假如这两张表在同一个库,正常流程是回滚事务,但因为事务失效,导致订单表插入成功,账户表扣减金额失败,最终数据不一致。

可能造成事务失效的因素有很多,比如下面集中情况:

  1. Java 代码开发中事务管理多数都由 Spring 来管理,但有些情况下 Spring 管理事务会失效,比如事务所在方法的定义上有 private、final、static,或者事务方法是一个内部方法,因为 Spring 无法创建代理;
  2. 事务所在方法被内部,Spring 也无法代理;
  3. 异常被捕获后没有抛出,或者抛出的异常不是 Spring 事务管理的异常,造成事务回滚失败(Spring 默认回滚 RuntimeException)。

1.2 隔离级别

虽然事务没有失效,但是因为事务隔离级别的问题,出现了脏读、不可重复读和幻读等问题。比如读取了其他未提交事务修改的数据,如果那个事务最终回滚,读取到的就是脏数据,导致不一致。

要解决这个问题,就需要根据业务需求选择合适的隔离级别。

1.3 分布式事务

还是用上面客户下单的例子,如果系统是分布式架构,订单服务和账户服务不在一个应用中,那账户服务扣减金额失败了,订单服务无法回滚。

这种情况可以引入分布式事务框架,比如 Seata 或者 RocketMQ 的分布式事务。

2.数据同步







请到「今天看啥」查看全文