原文: https://beginnersbook.com/2017/09/concurrency-control-in-dbms/

当同时运行多个事务时,可能会发生冲突,从而使数据库处于不一致状态。为了处理这些冲突,我们需要 DBMS 中的并发控制,它允许事务同时运行,但以这样的方式处理它们,以便数据的完整性保持不变。

我们举一个例子来理解我在这里说的话。

冲突示例

你和你的兄弟有一个联合银行账户,你可以从中提取资金。现在让我们说你们两个同时去同一家银行的不同分行尝试提取 5000 INR,你的联名账户只有 6000 余额。现在,如果我们没有并发控制,你们两个可以同时获得 5000 INR,但是一旦两个事务完成,账户余额将是-4000,这是不可能的,并使数据库处于不一致状态。

我们需要以某种方式控制事务的东西,允许事务同时运行,但保持数据的一致性以避免此类问题。

冲突解决方案:锁

锁是一种确保维护数据完整性的机制。在访问数据时可以放置两种类型的锁,以便在我们处理数据时并发事务不会改变数据。

  1. 共享锁(S
  2. 独占锁(X

1. 共享锁(S:当我们读取数据时放置共享锁,可以在数据上放置多个共享锁,但是当放置共享锁时,不能放置独占锁。

例如,当两个事务正在读取史蒂夫的账户余额时,让他们通过放置共享锁来读取,但如果另一个事务想要通过放置独家锁来更新史蒂夫的账户余额,则在读取完成之前不要允许它。

2. 独占锁(X:当我们想要读取和写入数据时,放置独占锁。此锁允许读取和写入操作。一旦将此锁放在数据上,就不会对数据放置其他锁(共享或独占),直到释放独占锁。

例如,当一个事务想要更新史蒂夫的账户余额时,让它通过放置X锁来做,但如果第二个事务想要读取数据(S锁)不允许它,如果另一个事务想要写入数据(X锁)也不允许这样做。

所以基于此,我们可以创建一个这样的表:

锁兼容性矩阵

  1. __________________________
  2. | | S | X |
  3. |-------------------------
  4. | S | True | False |
  5. |-------------------------
  6. | X | False | False |
  7. --------------------------

如何读取这个矩阵?:

有两行,第一行表示当放置S锁时,可以获取另一个S锁,因此它被标记为true但是没有可以获得独占锁标记为假。

在第二行中,当获取X锁时,既不能获取S也不能获得X锁,因此两者都标记为假。