DBMS 中的并发控制

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

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

冲突示例

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

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

冲突解决方案:锁

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

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

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

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

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

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

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

锁兼容性矩阵

__________________________
|     |   S    |    X    |
|-------------------------
|  S  | True   |   False |
|-------------------------
|  X  | False  |   False |
--------------------------

如何读取这个矩阵?

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程