【发布时间】:2017-04-21 16:23:51
【问题描述】:
假设有一家医院运行一个简单的数据库。在这个数据库中有一个名为“患者”的表,其中包含 1,000,000 条记录——每条记录都是状态为“活跃”或“出院”的患者。
Bob 运行以下查询,这将需要几秒钟或几分钟才能运行:
SELECT COUNT(*) FROM PATIENTS WHERE STATUS = "active"
在 Bob 开始执行查询的那一刻,有 100 名患者处于活动状态。
但是,当查询运行时,Susie 在表上运行以下命令:
UPDATE PATIENTS SET STATUS = "discharged" WHERE PATIENT_ID = 583739789
此命令会释放一名活跃的患者,将真正的“活跃”患者数更改为 99。
在 Susie 执行此操作后,Bob 的查询完成。他的查询结果是 100 名还是 99 名活跃患者?不同的数据库如何处理这个问题(Oracle、MySQL、SQLite 等)?
【问题讨论】:
-
取决于数据库,它是如何编码的。对于任何商业数据库来说,“并发”的能力是内置的,但是用“事务”的概念来描述,这是一个复杂、多面的话题,有很多场景,并且允许不同程度的逻辑和执行线程之间的物理分离。一般来说,对于任何商业数据库,它们处理各种场景的方式非常非常相似,即使不相同。
-
This 会有所帮助。
标签: sql database corruption single-threaded