一、锁
(一)唯一索引:最轻量的分布式锁
1.为什么唯一索引能防重复?
多台机器同时插入同一行,InnoDB 在插入时回检查唯一键。第一个事务拿到锁并插入成功,第二个事务回阻塞在该索引记录上,直到第一个事务提交后抛出 DuplicateKeyException。
(二)条件更新(CAS):比 version 更轻的乐观锁
update ... set status=1 where id=? and status=0
影响行数=1-》抢到了
影响行数=0-〉别人已经抢到了
乐观锁 vs 悲观锁
| 乐观锁 | 悲观锁 | |
|---|---|---|
| 锁对象 | 数据版本 | 数据库行锁 |
| 冲突时 | 更新影响行数 0 行,自己重试或退出 | 阻塞等待 |
| 适用 | 冲突少、任务短 | 冲突多、必须成功 |
| 风险 | 冲突高了空转 | 长事务锁超时,死锁 |
调度器的场景:冲突其实是“我本不该执行”,而不是“我要等别人”。
所以选乐观锁,抢不到就退出,这才是对的语义。
