常见的数据库隔离级别以及企业里常用的是什么方案

常见的数据库隔离级别以及企业里常用的是什么方案
基础知识MySQL 默认隔离级别 RR可重复读依靠MVCC 多版本并发控制避免普通幻读如果是当前读select … for update 锁查询依靠间隙锁 临键锁彻底解决幻读。只有最高隔离级别串行化 (Serializable) 完全杜绝所有幻读。脏读事务 B更新 money500未 commit事务 A查询读到 money500读到未提交数据事务 B执行 rollback 回滚数据变回 1000问题A 拿到的 500 是脏数据完全错误不可重复读已有行的值被修改事务 A第一次查询 money1000事务 B更新 money600执行 commit 提交事务 A再次查询money600问题A 同一个事务两次读同一行结果不一样不可重复读取幻读新增 / 删除了行事务 Aselect * from account where money 2000查到 1 条数据事务 B插入一条 money800 的新数据commit事务 A相同条件再次查询查到 2 条数据问题A 明明没操作凭空多出一条数据称为幻行四种隔离级别1.读未提交存在脏读、不可重复读、幻读2.读已提交存在不可重复读、幻读3.可重复读存在幻读4.串行化三个都不存在mysql innodb默认可重复读但是大厂为了提升并发性能常设计为读已提交由业务层都低处理重复读、幻读问题MySQL RC 关闭间隙锁只有记录锁并发高但无法靠数据库隔离级别规避上面不可重复读和幻读全部交给业务层兜底下面分通用方案 完整订单扣库存实战案例。业务层通用兜底方案大厂主流1.悲观锁方案for updateRC 下 select … for update 加行排他锁锁定当前行其他事务阻塞更新/删除规避不可重复读缺点并发高容易锁等待适合库存、订单扣减这类短事务。2.乐观锁版本号 version / 时间戳无锁靠版本号控制更新更新时校验版本不一致直接失败重试互联网最常用。3.唯一约束防幻读插入幻读根源是并发插入给关键字段加唯一索引重复插入直接抛唯一冲突捕获异常重试。4.分布式锁Redis/Zookeeper全局锁住资源同一商品/订单同一时间只允许一个事务操作彻底杜绝并发读写冲突。5.最终一致性兜底消息队列对账业务操作事务消息定时对账补偿即使并发出现数据不一致后台定时任务修复。6.避免长事务RC 冲突概率和事务时长正相关所有更新逻辑尽量缩小事务范围。乐观锁示例查询当前商品库存、版本号sqlSELECT stock, version FROM product_stock WHERE product_id 1001;判断库存是否充足不足直接返回失败执行扣减带上版本号做条件更新sqlUPDATE product_stockSET stock stock - 1, version version 1WHERE product_id 1001 AND version #{old_version};判断更新影响行数row 0扣减成功提交事务row 0说明中间被其他事务修改不可重复读导致版本过期回滚重试 2~3 次。解决了什么不可重复读版本号校验拦截中间更新库存超卖多并发只会有一个事务更新成功幻读插入 product_id 唯一索引不会重复创建库存行。数据库唯一索引插入防幻读悲观锁示例sqlBEGIN;– 加行排他锁锁定该行其他事务阻塞读写SELECT stock FROM product_stock WHERE product_id 1001 FOR UPDATE;if (stock 1) {ROLLBACK;return “库存不足”;}UPDATE product_stock SET stock stock - 1 WHERE product_id 1001;COMMIT;加锁后同一商品同一时间只能一个事务操作不会出现两次读取库存不一致不可重复读。分布式锁示例单纯数据库锁扛不住秒杀流量Redis分布式锁前置拦截java// 1. 先抢商品分布式锁String lockKey “lock:stock:1001”;boolean lock redisTemplate.tryLock(lockKey, 3, TimeUnit.SECONDS);if (!lock) return “抢购拥挤请重试”;try {// 2. 数据库RC事务扣库存乐观锁boolean success deductStockWithVersion(1001);if (!success) throw new Exception(“库存变动重试”);} finally {// 释放锁redisTemplate.unlock(lockKey);}全局锁保证同一商品同时只有一个业务流程操作从源头避免并发读写冲突彻底屏蔽不可重复读、幻读。无论乐观锁/分布式锁网络、DB超时都可能出现不一致大厂必加定时对账任务订单表已支付订单汇总扣减库存总量和商品实时库存做差值校验差值不为0则自动补发库存/生成异常工单人工处理这是最终兜底隔离级别带来的一致性问题全部可以靠对账抹平。