知识卡片

锁定协议:用共享锁与排他锁防止并发异常

专业/工作 · 1293.f

内容

多个事务同时穿插执行时会产生两类经典错误:错误决算问题(一笔转账进行到一半时,另一个事务恰好统计总额,结果多算或少算)、更新丢失问题(两个事务都基于同一个旧余额分别做扣款计算,其中一次扣款结果会被另一次覆盖丢失)。锁定协议通过给数据项打标记来避免这类问题:只读不改的事务申请共享锁,允许多个事务同时持有;打算修改数据的事务必须申请排他锁,独占访问权,此时任何其他事务(无论读写)都必须等待。发散:这与[[信号量与临界区:解决竞态条件]]是同一个并发控制问题在数据库层面的具体化——本质都是”多方同时接触同一份可变状态时如何避免互相踩踏”,区别在于数据库的锁定协议额外区分了读和写两种意图(共享锁 vs 排他锁),因为多个只读操作彼此并不冲突,不必像互斥访问那样一刀切地全部串行化,这是对”越精细地区分冲突类型,就能保留越多本可并发的操作”这一原则的具体应用。

参考来源

《计算机科学概论》第9章《数据库系统》