fix ch7-transaction: serializability

This commit is contained in:
AlphaWang 2022-08-01 23:41:25 +08:00
parent b9ea463bc6
commit c564c08884

4
ch7.md
View File

@ -487,7 +487,7 @@ UPDATE wiki_pages SET content = '新内容'
我们已经看到,有各种不同的方法来防止丢失的更新。但对于写偏差,我们的选择更受限制:
* 由于涉及多个对象,单对象的原子操作不起作用。
* 不幸的是,在一些快照隔离的实现中,自动检测丢失更新对此没有帮助。在 PostgreSQL 的可重复读MySQL/InnoDB 的可重复读Oracle 可串行化或 SQL Server 的快照隔离级别中都不会自动检测写入偏差【23】。自动防止写入偏差需要真正的可串行化隔离请参阅 “[可串行化](#可串行化)”)。
* 不幸的是,在一些快照隔离的实现中,自动检测丢失更新对此没有帮助。在 PostgreSQL 的可重复读MySQL/InnoDB 的可重复读Oracle 可串行化或 SQL Server 的快照隔离级别中都不会自动检测写入偏差【23】。自动防止写入偏差需要真正的可串行化隔离请参阅 “[可串行化](#可串行化)”)。
* 某些数据库允许配置约束然后由数据库强制执行例如唯一性外键约束或特定值限制。但是为了指定至少有一名医生必须在线需要一个涉及多个对象的约束。大多数数据库没有内置对这种约束的支持但是你可以使用触发器或者物化视图来实现它们这取决于不同的数据库【42】。
* 如果无法使用可串行化的隔离级别,则此情况下的次优选项可能是显式锁定事务所依赖的行。在例子中,你可以写下如下的代码:
@ -871,7 +871,7 @@ WHERE room_id = 123 AND
一个相当新的算法,避免了先前方法的大部分缺点。它使用乐观的方法,允许事务执行而无需阻塞。当一个事务想要提交时,它会进行检查,如果执行不可串行化,事务就会被中止。
本章中的示例主要是在关系数据模型的上下文中。但是,正如 “**[多对象事务的需求](#多对象事务的需求)**” 中所讨论的,无论使用哪种数据模型,事务都是有价值的数据库功能。
本章中的示例主要是在关系数据模型的上下文中。但是,正如 “**[多对象事务的需求](#多对象事务的需求)**” 中所讨论的,无论使用哪种数据模型,事务都是有价值的数据库功能。
本章主要是在单机数据库的上下文中,探讨了各种想法和算法。分布式数据库中的事务,则引入了一系列新的困难挑战,我们将在接下来的两章中讨论。