【问题标题】:Are databases single-threaded?数据库是单线程的吗?
【发布时间】: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


【解决方案1】:

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

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

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

更好的理解方式有点像访问文件(数据库在这方面大同小异)。

如果没有特定的知道(例如正在写入文件的哪一部分),2 个线程不能真正“可靠地”同时写入文件,但即使知道这会导致线程写入文件的前面部分将内容推送到文件的后面。

因此,由于这种原因,SQL 是“事务性的”,并以顺序方式处理每条语句……它非常擅长快速处理!

【讨论】:

  • “如果没有特定的知识,2 个线程无法真正可靠地同时写入文件”。在我的示例中,只有一个线程正在写入表(Susie 的查询)。因此,这不是两个 UPDATE 查询同时进行的情况,而是一个 SELECT,然后是 UPDATE。 SELECT 查询运行时,数据库是否还在表上加锁?
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 2011-03-12
  • 2014-10-12
  • 2013-10-31
  • 2011-10-04
  • 2011-10-24
  • 2019-07-31
  • 2020-09-19
相关资源
最近更新 更多