数据库中的锁定可以在 4 个级别上完成,从最高级别的数据库开始,然后通过 table 和 page 到最低级别的行。
- 数据库级
- 表级
- 页面级
- 行级
在讨论锁的级别之前,我们应该了解锁的类型或锁模式。因此,锁定中有 5 种锁定类型,下面将讨论这些:
- 独家 (X) 锁定-
这种锁定方法根据锁的用途来区分锁。这也确保页面的数据或信息将专门为那些使用排他锁的事务保留。这些锁仅应用于执行 WRITE 操作的那些资源。仅当尚未应用其他共享或排他类型的锁时,才能将这些锁应用于页面。 - 共享 (S) 锁 –
这种锁定方法仅适用于读取操作。如果此锁应用于任何行或页,则它将保留该行或页以供读取操作。我们可以在同一行或同一页上应用多个锁,但不应应用于任何其他类型的锁。 - 意图排他 (IX) 锁 –
这种在较低级别使用排他或共享锁锁定显式锁定的方法。这意味着如果一个事务使用了这种类型的锁,那么它必须是通过单独施加排他锁来修改较低级别资源的情况。 - 意图共享 (IS) 锁 –
这种锁定方法是在树的较低级别上显式锁定,但仅限于共享锁。这意味着如果一个事务使用了这种类型的锁,那么它必须是通过单独施加共享锁来读取较低级别资源的情况。 - 共享意图排他 (SIX) 锁 –
这种锁定方法表明事务用于读取较低级别的资源。在 SIX 中,我们将共享锁强加在较低级别的所有可用资源上。以该节点为根的子树在共享模式下被显式锁定,而显式锁定是在较低级别使用排他模式锁完成的。在这种方法中,一次只能在一个关系上获取一个 SIX,如果有任何其他事务需要更新任何更改,那么它将阻塞这些事务。 - 更新 (U) 锁 –
这种锁定方法可以施加在已经包含共享锁的记录上,如果它已经有共享锁,那么更新锁将在关系的目标行或页上施加另一个共享锁。这与排他锁相同,并且在某些方面也很灵活。这里在这个锁中,在检查事务持有修改数据的更新锁后,然后将更新锁修改为排他锁。
现在,让我们一一讨论锁定的级别。
1. 数据库级别:
在数据库级别,完整或完整的数据库被锁定。现在,假设数据库中有两个关系。如果说,R1 和 R2,其中 R1 使用表,那么 R2 不能使用它们。您将始终在此级别上找到一个共享锁,每当事务连接到数据库时都会使用该共享锁。在这个级别上,我们使用共享锁定来防止删除数据库或通过正在使用的数据库恢复数据库备份。让我们看一个例子。当我们使用 SELECT 语句读取一些数据时,将在数据库级别应用共享锁,在表和页级别应用意图共享锁,以及在行本身上应用共享锁。
数据库级应用——
- 这种类型的锁定适用于一组进程。
- 这种类型的锁很慢,所以不用于多用户DBMS的在线版本。
2. 表级:
在表级别,整个表或关系被锁定。现在,如果假设数据库中有两个关系,比如 R1 和 R2,其中 R1 使用表,那么 R2 不能使用它。但是,两个事务只有在访问不同的关系时才能访问同一个数据库。使用表级别的事务将持有共享和/或排他表锁。在表级别,有 5 种不同类型的锁。即,Exclusive (X)、Shared (S)、Intent Exclusive (IX)、Intent shared (IS) 和 Shared with Intent Exclusive (SIX),上面已经讨论了这些锁。
表级应用 –
- 这种类型的锁定级别不适用于多用户数据库管理系统。
- 它还主要用于防止在 DML 操作中删除关系。
3. 页面级别:
Page-level 总是由固定大小组成,即 2 或 2 i 的幂类型。一个表可以跨越多个页面,一个页面可以包含一个或多个关系的多个元组。在页面级别,将施加意图共享锁 (IS)。此锁能够锁定表、共享或独占页。如果存在 DML 语句(即插入、更新、删除)的情况,将施加意向排他锁 (IX) 或意向更新锁 (IU)。
页面级应用——
- 这种类型的锁定级别适用于多用户数据库管理系统。
- 它们相对较快,但也存在各种冲突。
4. 行级:
与其他级别的锁定相比,此级别的锁定限制较少。在行级别,如果一个并发事务正在访问同一关系中的不同行,即使这些行位于同一页上,也可以被数据库系统接受。在这个级别,DBMS 允许并发事务访问相同关系的行,即使这些行位于同一页上。在这个级别,我们可以应用 3 种不同类型的锁,即 Exclusive、Shared、Update,这些锁已经在上面讨论过,并且在这个级别的查询中锁定了特定的行。
行级的应用——
- 与其他级别的锁定相比,它的成本非常高。
- 这也是非常严格的。