# DBMS 中的并发控制

> 原文： [https://beginnersbook.com/2017/09/concurrency-control-in-dbms/](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`锁）也不允许这样做。

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

### 锁兼容性矩阵

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

```

**如何读取这个矩阵？：**

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

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