use*_*495 6 sql database corruption single-threaded
假设有一家医院运行一个简单的数据库。该数据库中有一个名为“患者”的表,其中包含 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 等)?
鉴于问题提到 SQL 查询,我假设您的意思是“所有 SQL 查询都是单线程的”。
SQL 服务器设计用于处理多个连接,但事务日志中的每个条目都必须按顺序处理。
简而言之,许多人可以通过多个线程连接到服务器,但在任何给定时间点只能发生 1 个事务。
更好的看待这个问题的方法有点像访问文件(数据库在这方面非常相似)。
如果没有一些特定的信息(例如正在写入文件的哪一部分),2 个线程无法同时“可靠”地写入文件,但即使知道这也会导致线程写入较早的部分文件的内容稍后会推送到文件中。
因此,出于这种原因,SQL 是“事务性的”,并以顺序方式处理每个语句……它非常擅长快速执行!