多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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`锁,因此两者都标记为假。