DBMS 中的并发控制,当同时运行多个事务时,可能会发生冲突,从而使数据库处于不一致状态。为了处理这些冲突,我们需要 DBMS 中的并发控制,它允许事务同时运行,但以这样的方式处理它们,以便数据的完整性保持不变。
我们举一个例子来理解我在这里说的话。
冲突示例
你和你的兄弟有一个联合银行账户,你可以从中提取资金。现在让我们说你们两个同时去同一家银行的不同分行尝试提取 5000 INR,你的联名账户只有 6000 余额。现在,如果我们没有并发控制,你们两个可以同时获得 5000 INR,但是一旦两个事务完成,账户余额将是-4000,这是不可能的,并使数据库处于不一致状态。
我们需要以某种方式控制事务的东西,允许事务同时运行,但保持数据的一致性以避免此类问题。
冲突解决方案:锁
锁是一种确保维护数据完整性的机制。在访问数据时可以放置两种类型的锁,以便在我们处理数据时并发事务不会改变数据。
- 共享锁(
S
) - 独占锁(
X
)
共享锁(S
):当我们读取数据时放置共享锁,可以在数据上放置多个共享锁,但是当放置共享锁时,不能放置独占锁。
例如,当两个事务正在读取史蒂夫的账户余额时,让他们通过放置共享锁来读取,但如果另一个事务想要通过放置独家锁来更新史蒂夫的账户余额,则在读取完成之前不要允许它。
独占锁(X
):当我们想要读取和写入数据时,放置独占锁。此锁允许读取和写入操作。一旦将此锁放在数据上,就不会对数据放置其他锁(共享或独占),直到释放独占锁。
例如,当一个事务想要更新史蒂夫的账户余额时,让它通过放置X
锁来做,但如果第二个事务想要读取数据(S
锁)不允许它,如果另一个事务想要写入数据(X
锁)也不允许这样做。
所以基于此,我们可以创建一个这样的表:
锁兼容性矩阵
__________________________
| | S | X |
|-------------------------
| S | True | False |
|-------------------------
| X | False | False |
--------------------------
如何读取这个矩阵?
有两行,第一行表示当放置S
锁时,可以获取另一个S
锁,因此它被标记为true
但是没有可以获得独占锁标记为假。
在第二行中,当获取X
锁时,既不能获取S
也不能获得X
锁,因此两者都标记为假。