数据库是单线程的吗?

时间:2017-04-21 16:23:51

标签: sql database corruption single-threaded

让我们说有一家医院运营着一个简单的数据库。在这个数据库中有一个名为"患者"拥有1,000,000条记录 - 每条记录都是一名患者,其状态为“活跃”和#34;或"出院"。

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等)?

1 个答案:

答案 0 :(得分:1)

鉴于问题提到SQL查询,我将假设你的意思是“所有SQL查询都是单线程的”。

SQL服务器旨在处理多个连接,但必须按顺序处理事务日志中的每个条目。

简而言之,许多人可以在多个线程上连接到服务器,但在任何给定的时间点只能发生一次事务。

更好的观察方式有点像访问文件(数据库在这方面大致相同)。

2个线程无法真正“可靠地”写入文件同时没有某些特定的知识到位(例如,正在写入文件的哪个部分),但即使知道这会导致线程写入文件的早期部分稍后在文件中推送内容。

因此,出于这种原因,SQL是“事务性的”并以顺序方式处理每个语句......它真的很擅长快速完成!