设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server中事务的ACID属性包含什么 如何理解

发布时间:2023-05-19 11:41 所属栏目:116 来源:互联网
导读:这篇文章主要介绍SQL Server中事务的ACID属性包括什么,如何理解,有一些人在SQL Server中事务的ACID属性包括什么,如何理解的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。 SQ
  这篇文章主要介绍“SQL Server中事务的ACID属性包括什么,如何理解”,有一些人在SQL Server中事务的ACID属性包括什么,如何理解的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。
 
  SQL Server 中的事务是什么?
  SQL Server 中的事务是一组被视为一个单元的 SQL 语句,它们按照“做所有事或不做任何事”的原则执行,成功的事务必须通过 ACID 测试。
 
  事务的 ACID 属性是什么?
  首字母缩写词 ACID 是指事务的四个关键属性
 
  原子性: Atomicity
  一致性: Consistency
  隔离性: Isolation
  持久性: Durability
  为了理解这一点,我们将使用以下两个表测试。
 
  Product (产品表)
 
  ProductID Name Price Quantity
  101 Laptop 15000 100
  102 Desktop 20000 150
  104 Mobile 3000 200
  105 Tablet 4000 250
  ProductSales (产品销售表)
 
  ProductSalesID ProductID QuantitySold
  1 101 10
  2 102 15
  3 104 30
  4 105 35
  请使用以下 SQL 脚本创建并使用示例数据填充 Product 和 ProductSales 表。
 
  IF OBJECT_ID('dbo.Product','U') IS NOT NULL
      DROP TABLE dbo.Product
  IF OBJECT_ID('dbo.ProductSales','U') IS NOT NULL
      DROP TABLE dbo.ProductSales
  GO
  CREATE TABLE Product
  (
    ProductID INT PRIMARY KEY,
    Name VARCHAR(40),
    Price INT,
    Quantity INT
   )
  GO
  INSERT INTO Product VALUES(101, 'Laptop', 15000, 100)
  INSERT INTO Product VALUES(102, 'Desktop', 20000, 150)
  INSERT INTO Product VALUES(103, 'Mobile', 3000, 200)
  INSERT INTO Product VALUES(104, 'Tablet', 4000, 250)
  GO
  CREATE TABLE ProductSales
  (
    ProductSalesId INT PRIMARY KEY,
    ProductId INT,
    QuantitySold INT
  )
  GO
  INSERT INTO ProductSales VALUES(1, 101, 10)
  INSERT INTO ProductSales VALUES(2, 102, 15)
  INSERT INTO ProductSales VALUES(3, 103, 30)
  INSERT INTO ProductSales VALUES(4, 104, 35)
  GO
  SQL Server 中事务的原子性
  SQL Server 中事务的原子性确保事务中的所有 DML 语句(即插入、更新、删除)成功完成或全部回滚。例如,在以下 spSellProduct 存储过程中,UPDATE 和 INSERT 语句都应该成功。如果 UPDATE 语句成功而 INSERT 语句失败,数据库应该通过回滚来撤消 UPDATE 语句所做的更改。
 
  IF OBJECT_ID('spSellProduct','P') IS NOT NULL
      DROP PROCEDURE spSellProduct
  GO
  CREATE PROCEDURE spSellProduct
  @ProductID INT,
  @QuantityToSell INT
  AS
  BEGIN
    
    -- 首先我们需要检查待销售产品的可用库存
    DECLARE @StockAvailable INT
    SELECT @StockAvailable = Quantity FROM Product WHERE ProductId = @ProductId
 
    --如果可用库存小于要销售的数量,抛出错误
    IF(@StockAvailable < @QuantityToSell)
    BEGIN
      Raiserror('可用库存不足',16,1)
    END
 
    -- 如果可用库存充足
    ELSE
    BEGIN
      BEGIN TRY
        -- 我们需要开启一个事务
        BEGIN TRANSACTION
 
        -- 首先做减库存操作
        UPDATE Product SET Quantity = (Quantity - @QuantityToSell) WHERE ProductID = @ProductID
 
        -- 计算当前最大的产品销售ID,即 MaxProductSalesId
        DECLARE @MaxProductSalesId INT
        SELECT @MaxProductSalesId = CASE
            WHEN MAX(ProductSalesId) IS NULL THEN 0
            ELSE MAX(ProductSalesId)
            END
        FROM ProductSales
 
        -- 把 @MaxProductSalesId 加一, 所以我们会避免主键冲突
        --(解释下,建表的时候,没有设置主键自增,所以需要人工处理自增)
        Set @MaxProductSalesId = @MaxProductSalesId + 1
 
        -- 把销售的产品数量记录到ProductSales表中
        INSERT INTO ProductSales VALUES (@MaxProductSalesId, @ProductId, @QuantityToSell)
 
        -- 最后,提交事务
        COMMIT TRANSACTION
      END TRY
 
      BEGIN CATCH
        -- 如果发生了异常,回滚事务
        ROLLBACK TRANSACTION
      END CATCH
 
    End
  END
  SQL Server 中事务的一致性
  SQL Server 中事务的一致性确保数据库数据在事务开始之前处于一致状态,并且在事务完成后也使数据保持一致状态。如果事务违反规则,则应回滚。例如,如果可用库存从 Product 表中减少,那么 ProductSales 表中必须有一个相关条目。
 
  在我们的示例中,假设事务更新了 product 表中的可用数量,突然出现系统故障(就在插入 ProductSales 表之前或中间)。在这种情况下系统会回滚更新,否则我们无法追踪库存信息。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读