医生值班示例:规范化关系模式以避免写偏现象
内容提要
在《设计数据密集型应用》中,Martin Kleppmann用医院值班医生的例子解释写偏现象。多个医生可同时值班,但至少一名医生需在岗。医生放弃值班前需确保至少两人在岗。文章探讨不同隔离级别下的并发事务问题,如读已提交和可序列化隔离级别。通过显式锁定(如SELECT FOR UPDATE)可避免写偏现象。YugabyteDB通过范围锁优化锁定,支持所有SQL隔离级别,并兼容PostgreSQL的隐式锁定。
关键要点
-
Martin Kleppmann在《设计数据密集型应用》中用医院值班医生的例子解释写偏现象。
-
多个医生可以同时值班,但至少一名医生需在岗,放弃值班前需确保至少两人在岗。
-
文章探讨不同隔离级别下的并发事务问题,如读已提交和可序列化隔离级别。
-
显式锁定(如SELECT FOR UPDATE)可避免写偏现象。
-
YugabyteDB通过范围锁优化锁定,支持所有SQL隔离级别,并兼容PostgreSQL的隐式锁定。
-
在读已提交隔离级别下,两个医生的事务相互隔离,可能导致没有医生在岗的异常情况。
-
可序列化隔离级别下,PostgreSQL会检测冲突并阻止第二次更新。
-
YugabyteDB使用悲观锁定,默认情况下等待其他事务完成以避免冲突。
-
YugabyteDB通过范围锁避免锁定整个表,基于复合主键的值进行锁定。
-
通过创建不同的表来防止读已提交下的写偏现象,使用显式锁定来序列化事务。
-
YugabyteDB实现了所有SQL隔离级别,并支持PostgreSQL的隐式锁定SELECT FOR SHARE和SELECT FOR UPDATE。
延伸问答
什么是写偏现象?
写偏现象是指在并发事务中,多个事务基于相同的状态进行决策,导致最终结果不符合预期的情况。
如何避免写偏现象?
可以通过使用显式锁定(如SELECT FOR UPDATE)和可序列化隔离级别来避免写偏现象。
YugabyteDB如何处理并发事务?
YugabyteDB使用悲观锁定和范围锁来处理并发事务,支持所有SQL隔离级别,并兼容PostgreSQL的隐式锁定。
在读已提交隔离级别下可能出现什么问题?
在读已提交隔离级别下,两个医生的事务相互隔离,可能导致没有医生在岗的异常情况。
可序列化隔离级别如何防止冲突?
可序列化隔离级别会检测事务之间的冲突,阻止第二次更新,从而避免写偏现象。
如何通过表结构设计防止写偏现象?
可以通过创建不同的表来管理医生和班次,并使用显式锁定来序列化对同一班次的事务。