上一篇
想象一下这个场景:
你正在运营一个电商平台,商品库存是核心数据,某热门商品只剩最后一件,用户A和用户B几乎同时点击“购买”,如果没有合适的并发控制,系统可能会这样处理:
这就是典型的数据一致性问题,如何避免?并发控制和数据库锁是关键。
数据一致性指的是数据库中的数据在任何时候都保持逻辑正确,不会因为并发操作而出现矛盾。
如果缺乏控制,脏读(Dirty Read)、不可重复读(Non-repeatable Read)、幻读(Phantom Read)等问题就会出现。
核心思想:“先锁住,再操作”,认为冲突很可能发生。
行级锁(Row Lock):锁定某一行数据,其他事务无法修改。
BEGIN; SELECT * FROM products WHERE id = 1 FOR UPDATE; -- 加锁 UPDATE products SET stock = stock - 1 WHERE id = 1; COMMIT;
适合高竞争场景,但可能降低并发性能。
表级锁(Table Lock):直接锁整张表,简单粗暴,但并发性极差,一般避免使用。
核心思想:“先操作,冲突了再处理”,认为冲突不常发生。
版本号控制:
每条数据加一个version
字段,更新时检查版本是否变化。
UPDATE products SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = 5; -- 只有版本匹配才更新
如果返回影响行数为0,说明别人已修改,需重试或提示用户。
CAS(Compare-And-Swap):类似版本号,用旧值比对后再更新。
不同隔离级别对一致性的保证不同:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | |||
READ COMMITTED | |||
REPEATABLE READ | |||
SERIALIZABLE |
场景:
解决方案:
innodb_lock_wait_timeout
)。 SHOW ENGINE INNODB STATUS
)可查看锁情况。 保障数据一致性的核心是控制并发访问:
测试是关键!模拟高并发场景(如JMeter压测),确保你的方案真的能扛住真实流量。
本文由 京晓星 于2025-08-03发表在【云服务器提供商】,文中图片由(京晓星)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/521415.html
发表评论