1. 丢失更新的防止,SELECT FOR UPDATE、版本号、CAS、SSI?
丢失更新可以通过哪些方式防止?SELECT FOR UPDATE、版本号、CAS、SSI 分别如何起作用?
- 悲观锁(FOR UPDATE)
- 乐观锁(版本号/CAS)
- SSI 检测
丢失更新可通过多种方式防止:SELECT ... FOR UPDATE 是悲观锁,把读操作变成当前读并加锁,使"读-改-写"串行化,防止并发覆盖;版本号(乐观锁)每次更新时校验版本号,若版本已变化则中止重试,保证"读-改-写"基于同一版本;CAS(Compare-And-Swap)用条件更新(UPDATE ... WHERE 期望值)原子地判断后写入;SSI 通过检测读写依赖环,在提交时中止可能造成丢失更新的冲突事务。它们分别从"加锁串行""版本校验""原子条件""依赖检测"四个角度防丢失更新。
丢失更新源于"先读后写、无锁",四个手段本质都是让"读-改-写"原子化或冲突可检测。悲观锁牺牲并发,乐观锁增加重试,SSI 由数据库检测。选择取决于冲突率与并发要求。