SQL Server 中的 ACID 属性

SQL Server 中的 ACID 属性可确保事务期间的数据完整性。ACID 是原子性、一致性、隔离性、持久性的首字母缩写。

在我们之前的文章中,我们已经解释了事务和嵌套事务。因此,在这些 ACID 属性之前,我建议您参考它们。在本文中,我将定义 SQL Server 中的每个 ACID 属性。

  • 原子性:原子性属性。这意味着事务中的所有操作(插入、更新、删除)要么全部发生,要么全部不发生。或者可以说,事务中的所有语句(插入、更新、删除)要么完成,要么回滚。
  • 一致性:这确保了数据库的一致性。这意味着无论事务中间发生了什么,都不会使您的数据库处于半完成状态。
    • 如果事务成功完成,它将对数据库应用所有更改。
    • 如果事务中出现错误,则所有已进行的更改都将自动回滚。这意味着数据库将恢复到事务开始之前的状态。
    • 如果在事务中间发生系统故障,所有已进行的更改都将自动回滚。
  • 隔离性:每个事务都是独立的,一个事务在完成之前无法访问其他事务的结果。或者,您不能在同一时间使用多个事务执行相同的操作。我们将在单独的文章中对此进行解释。
  • 持久性:一旦事务完成,它对数据库所做的更改将是永久性的。即使发生系统故障或任何异常更改,此属性也将保护已提交的数据。

SQL Server 中的 ACID 属性示例

我们将使用 Dim products 和 Sales 表来解释 Sql Server ACID 属性。下面的屏幕截图将向您展示 DimProduct 表中的数据。

以及 Sales 表中的数据是

在此演示中,每当发生销售时,我们都需要根据订单数量更新库存水平。例如,如果 A 订购了十件产品(产品密钥 = 216),则将库存水平更新为 4990,并在销售表中插入一条新记录。

ACID 中的原子性

这意味着事务中的所有语句都应该作为一个单元成功或失败。为了演示此 SQL 原子性 ACID 属性,我们在事务中使用了一个 UPDATE 和一个 INSERT 语句。请参考事务和嵌套事务概念。

USE [SQLTEST]
GO
BEGIN TRANSACTION
	UPDATE [DimProduct]
		SET [StockLevel] = 4700
		WHERE [ProductKey] = 213

	INSERT INTO [Sales] ([ProductKey], [OrderQuantity], [UnitPrice], [SalesAmount])
	VALUES (213, 300, 48.0673, 48.0673 * 300)
COMMIT TRANSACTION
ACID Properties in SQL Server 3

交易后,我将向您展示 DimProduct 和 Sales 表中的记录。

View Table Records 4

这次我们将往 Sales 表中插入错误的信息,故意导致插入失败。

USE [SQLTEST]
GO

BEGIN TRANSACTION
	UPDATE [DimProduct]
		SET [StockLevel] = 4700
		WHERE [ProductKey] = 213

	INSERT INTO [Sales] ([ProductKey], [OrderQuantity], [UnitPrice], [SalesAmount])
	VALUES (213, 300, 48.0673, 'Hey! This is Wrong')
COMMIT TRANSACTION
ACID Properties 5

交易后,我将向您展示 Dim Product 和 Sales 表中的记录。从上图可以看出,已提交的行(Update 语句)已被回滚。

ACID Properties 6

SQL 一致性 ACID 属性

我将以上面的例子来解释这个 ACID 属性。假设事务已经用新数据更新了库存,突然发生了系统故障(就在插入到 sales 之前或中间)。在这种情况下,系统将回滚更新。否则,您将无法跟踪库存信息。

ACID 中的隔离性

一个事务在完成之前不能访问其他事务的结果。对于 SQL Server 中的此 ACID 属性,它使用锁定来锁定表。正如您所看到的,我们正在使用两个独立的实例

  • 第一个实例:我们启动了事务并更新了记录,但我们没有提交或回滚事务。
  • 第二个实例:使用 Select 语句 选择 Dim Product 表中的记录。

从下面的屏幕截图可以看出,select 语句没有返回任何信息。因为在事务完成之前,我们无法访问一个事务的结果。

ACID Properties 7

我将执行 Rollback 事务。它将立即显示 Select 语句的结果,因为 Dim Product 表上的锁定已释放。希望您已理解 ACID 属性。

ACID Properties 8

评论已关闭。