DBMS 中的可串行化

2024年8月28日 | 阅读 8 分钟

大多数现代应用程序的支柱是 DBMS 的形式。当我们在正确设计形式时,它将为我们的应用程序提供高性能和相对的存储解决方案。在本主题中,我们将解释可串行化概念及其对 DBMS 的深远影响。我们还将通过一些示例理解可串行化的概念。最后,我们将通过一个关于可串行化重要性的示例来结束本主题。

DBMS 中的可串行化是什么?

在计算机科学领域,可串行化是系统的一个属性,它描述了不同的进程如何操作共享数据。如果系统给出的结果与系统执行的操作相似,那么在这种情况下,我们称该系统是可串行化的。这里的系统协作意味着数据执行没有重叠。在 DBMS 中,当数据被写入或读取时,DBMS 可以阻止所有其他进程访问该数据。

在 MongoDB 开发者认证中,DBMS 使用各种锁定系统来允许其他进程在保持数据完整性的同时运行。在 MongoDB 中,可串行化最严格的级别是可以通过两阶段锁定或 2PL 来限制的。在锁定级别的第一阶段,在操作执行之前会锁定数据对象。当事务完成时,数据对象的锁将被释放。此过程保证操作没有冲突,并且所有事务都将数据库视为无冲突数据库。

两阶段锁定或 2PL 系统为数据库冲突提供了强大的保证。

它可以降低性能,然后增加获取和释放数据锁的开销。因此,系统允许约束可串行化以提高 DBMS 的性能。这确保最终结果与某些顺序执行相同,并改进了数据库中涉及的操作。

因此,可串行化是系统的一个属性,它描述了不同的进程如何操作共享数据。在 DBMS 中,通过在其他进程执行期间锁定数据来采用整体可串行化属性。此外,可串行化确保最终结果等同于数据的顺序操作。

什么是可串行化调度?

  • 在 DBMS 中,可串行化调度是一个属性,其中读写操作序列不会干扰可串行化属性。此属性确保事务与其他事务自动执行。在 DBMS 中,可串行化的顺序必须与同一事务的某些串行调度相同。
  • 在 DBMS 中,有几种算法可用于检查数据库的可串行性。最重要算法之一是冲突可串行化算法。冲突可串行化算法是检查数据库中潜在冲突的能力。当两个事务访问相同数据时,就会在数据库中发生此冲突。如果没有冲突,则数据库保证可串行性。但是,如果发生冲突,则存在可串行化的可能性。
  • 用于检查数据库可串行性的另一种算法是 DBMS 算法。借助 DBMS 算法,我们可以检查两个事务之间潜在的相互依赖关系。当两个事务给出正确输出时,就存在相互依赖关系。当不存在相互依赖关系时,数据库就保证是可串行化的。但是,如果存在相互依赖关系,则存在可串行化的可能性。
  • 我们还可以使用优先图算法检查数据库的可串行性。当一个事务必须先于另一个事务才能使调度有效时,就存在优先关系。如果没有循环,则 DBMS 中调度的可串行性是有保证的。但是,如果存在循环,则调度可能可串行化,也可能不可串行化。要全面了解不同的算法,请参加 MongoDB 管理认证,并获得对 DBMS 中可串行化概念的专家分析。

可串行化类型

在 DBMS 中,所有事务都应按特定顺序排列,即使所有事务都是并发的。如果所有事务都不可串行化,则会产生不正确的结果。

在 DBMS 中,有不同类型的可串行化。每种可串行化类型都有其优点和缺点。最常见的两种可串行化类型是视图可串行化和冲突可串行化。

1. 冲突可串行化

冲突可串行化是可串行化中一种冲突操作,它操作相同的数据项,这些数据项应按特定顺序执行并保持数据库的一致性。在 DBMS 中,每个事务都有其唯一的值,并且数据库中的每个事务都基于该唯一值。

此唯一值可确保没有两个具有相同冲突值的操作被并发执行。例如,让我们考虑两个示例,即订单表和客户表。一个客户可以有多个订单,但每个订单只属于一个客户。数据库的冲突可串行化有一些条件。它们如下。

  • 两个操作应属于不同的事务。
  • 两个事务应具有相同的数据项。
  • 两个操作之间应至少有一个写操作。

如果有两个并发执行的事务,一个操作将添加第一个客户的事务,另一个操作将由第二个操作添加。此过程确保数据库不会出现不一致。

2. 视图可串行化

视图可串行化是可串行化中一种操作,其中每个事务都应产生一些结果,而这些结果是数据项正确顺序执行的输出。与冲突可串行化不同,视图可串行化侧重于防止数据库不一致。在 DBMS 中,视图可串行化允许用户以冲突的方式查看数据库。

在 DBMS 中,我们应该理解调度 S1 和 S2 以更好地理解视图可串行化。这两个调度应在两个事务 T1 和 T2 的帮助下创建。为了保持事务的等效性,每个调度都必须遵循三个事务。这三个条件如下。

  • 第一个条件是每个调度具有相同类型的事务。此条件的含义是,两个调度 S1 和 S2 必须具有相同类型的事务集。如果一个调度已提交事务但与另一个调度的事务不匹配,则这两个调度不等效。
  • 第二个条件是两个调度不应具有相同类型的读写操作。另一方面,如果调度 S1 有两个写操作,而调度 S2 有一个写操作,我们说这两个调度不等效。如果读操作的数量不同,我们也可以说没有问题,但两个调度中写操作的数量必须相同。
  • 最后一个条件是两个调度不应具有相同的冲突。相同数据项的执行顺序。例如,假设调度 S1 的事务是 T1,调度 S2 的事务是 T2。事务 T1 写入数据项 A,事务 T2 也写入数据项 A。在这种情况下,这两个调度不等效。但是,如果调度在数据项中的每个写操作数量相同,那么我们就说这两个调度是等效的。

使用示例在 DBMS 中测试可串行化

可串行化是 DBMS 的一种属性,其中每个事务都独立且自动地执行,即使这些事务是并发执行的。换句话说,我们可以说,如果有多个事务并发执行,那么可串行化函数的主要工作就是将这些多个事务按顺序排列。

为了更好地理解,让我们通过一个例子来解释。假设有两个用户 Sona 和 Archita。每个人执行两个事务。假设事务 T1 和 T2 由 Sona 执行,T3 和 T4 由 Archita 执行。假设事务 T1 读取和写入数据项 A,事务 T2 读取数据项 B,事务 T3 读取和写入数据项 C,事务 T4 读取数据项 D。让我们按如下方式调度上述事务。

让我们首先讨论为什么这些事务不可串行化。

为了使调度被视为可串行化,它必须首先满足冲突可串行化属性。在上面的示例调度中,请注意,事务 1 (T1) 和事务 2 (T2) 在写入数据项 B 之前都读取了它。这会在 T1 和 T2 之间造成冲突,因为它们都在尝试并发地读取和写入同一数据项。因此,给定的调度与可串行化不冲突。

然而,还有另一种可串行化称为视图可串行化,我们的示例满足它。视图可串行化要求,如果两个事务看不到彼此的更新(即,一个事务看不到另一个并发事务的效果),则该调度被视为视图可串行化。在我们的示例中,事务 2 (T2) 无法看到事务 4 (T4) 所做的任何更新,因为它们没有共享公共数据项。因此,该调度被视为可串行化的。

需要注意的是,冲突可串行化比视图可串行化更强大,因为它要求在进行任何更新之前解决所有潜在冲突(即,每个事务必须在任何其他事务可以写入它之前读取或写入每个数据项)。视图可串行化仅要求,如果两个事务看不到彼此的更新,则该调度是视图可串行化的,无论它们之间是否存在潜在冲突。

总而言之,这两种属性对于确保数据库管理系统中并发事务的正确性都是必需的。

DBMS 中可串行化的好处

以下是使用数据库中可串行化的好处。

  1. 可预测的执行:在可串行化中,DBMS 的所有线程都同时执行。DBMS 中没有惊喜。在 DBMS 中,所有变量都按预期更新,并且没有数据丢失或损坏。
  2. 易于理解和调试:在 DBMS 中,所有线程单独执行,因此很容易了解数据库的每个线程。这可以使调试过程非常容易。所以我们不必担心并发进程。
  3. 降低成本:借助可串行化属性,我们可以降低用于数据库平稳运行的硬件成本。它还可以降低软件的开发成本。
  4. 提高性能:在某些情况下,可串行化执行的性能可能优于非可串行化执行,因为它们允许开发人员优化其代码以提高性能。

结论

DBMS 事务必须遵循 ACID 属性才能被视为可串行化。DBMS 中有不同类型的可串行化,每种都有其优点和缺点。在大多数情况下,选择正确的可串行化类型将取决于性能和正确性之间的权衡。

选择错误的可串行化类型可能会导致数据库中出现难以调试和修复的错误。希望本指南能帮助您更好地理解 DBMS 中的可串行化是如何工作的以及存在哪些类型的可串行化。