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

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

这次我们将往 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

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

SQL 一致性 ACID 属性
我将以上面的例子来解释这个 ACID 属性。假设事务已经用新数据更新了库存,突然发生了系统故障(就在插入到 sales 之前或中间)。在这种情况下,系统将回滚更新。否则,您将无法跟踪库存信息。
ACID 中的隔离性
一个事务在完成之前不能访问其他事务的结果。对于 SQL Server 中的此 ACID 属性,它使用锁定来锁定表。正如您所看到的,我们正在使用两个独立的实例
- 第一个实例:我们启动了事务并更新了记录,但我们没有提交或回滚事务。
- 第二个实例:使用 Select 语句 选择 Dim Product 表中的记录。
从下面的屏幕截图可以看出,select 语句没有返回任何信息。因为在事务完成之前,我们无法访问一个事务的结果。

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

评论已关闭。