返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解SQL Server 中的 ACID 属性
  • 520
分享到

详解SQL Server 中的 ACID 属性

2024-04-02 19:04:59 520人浏览 独家记忆
摘要

目录SQL Server 中的事务是什么?事务的 ACID 属性是什么?sql Server 中事务的原子性SQL Server 中事务的一致性SQL Server 中事务的隔离性S

SQL Server 中的事务是什么?

SQL Server 中的事务是一组被视为一个单元的 SQL 语句,它们按照“做所有事或不做任何事”的原则执行,成功的事务必须通过 ACID 测试

事务的 ACID 属性是什么?

首字母缩写词 ACID 是指事务的四个关键属性

  • 原子性: Atomicity
  • 一致性: Consistency
  • 隔离性: Isolation
  • 持久性: Durability

为了理解这一点,我们将使用以下两个表测试。

Product (产品表)

ProductIDNamePriceQuantity
101Laptop15000100
102Desktop20000150
104Mobile3000200
105Tablet4000250

ProductSales (产品销售表)

ProductSalesIDProductIDQuantitySold
110110
210215
310430
410535

请使用以下 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 表之前或中间)。在这种情况下系统会回滚更新,否则我们无法追踪库存信息。

SQL Server 中事务的隔离性

SQL Server 中事务的隔离性确保事务的中间状态对其他事务不可见。一个事务所做的数据修改必须与所有其他事务所做的数据修改隔离。大多数数据库使用定来维护事务隔离。

为了理解事务的隔离性,我们将使用两个独立的 SQL Server 事务。从第一个事务开始,我们启动了事务并更新了 Product 表中的记录,但我们还没有提交或回滚事务。在第二个事务中,我们使用 select 语句来选择 Product 表中存在的记录,如下所示。

在sqlserver management studio 或 Navicat 中新建两个独立的查询窗口

首先在第1个窗口运行以下事务,更新库存(注意事务没有提交或回滚,回滚语句被注释了)

begin tran
update dbo.Product set Quantity = 150 where ProductID = 101
--rollback tran

然后在第2个窗口运行以下语句,查询被更新的产品

select * from dbo.Product where ProductID = 101

你会发现,第2个窗口中的查询语句被阻塞了(一直处于运行状态,没有返回数据)

解决阻塞: 切换到第1个窗口, (按下鼠标左键拖动选择 rollback tran ,注意不包含注释 -- ),
然后单独执行这个语句, 在 sqlserver management studio 直接点击执行就行, 在 Navicat 中,点击运行按钮右边的下拉箭头,点击运行已选择的,好了,再切换到第2个窗口,你会发现结果出来了

阻塞的原因: SqlServer默认的事务隔离级别是 Read Committed,
在上述的Update语句执行时会在对应的数据行上加一个 排它锁(X), 直到事务提交或者回滚才会释放,这保证了在此期间,其他任何事务都不能操作此行数据(查询也不行),因为排它锁(也叫独占锁),和其他类型的锁都是不兼容的,这保证了其他事务看不到另一个事务的中间状态,即避免了脏读

SQL Server 中事务的持久性

SQL Server 中事务的持久性确保一旦事务成功完成,它对数据库所做的更改将是永久性的。即使出现系统故障或电源故障或任何异常变化,它也应该保护已提交的数据。

注意:首字母缩写词 ACID 由 Andreas Reuter 和 Theo Härder 在 1983 年创建,然而,Jim Gray 在 1970 年代后期已经定义了这些属性。大多数流行的数据库,如 SQL Server、oracleMysql、Postgre SQL 默认都遵循 ACID 属性。

到此这篇关于SQL Server 中的 ACID 属性的文章就介绍到这了,更多相关SQL Server ACID内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解SQL Server 中的 ACID 属性

本文链接: https://lsjlt.com/news/164161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解SQL Server 中的 ACID 属性
    目录SQL Server 中的事务是什么?事务的 ACID 属性是什么?SQL Server 中事务的原子性SQL Server 中事务的一致性SQL Server 中事务的隔离性SQL Server 中事务的持久性SQ...
    99+
    2022-07-13
    SQL Server ACID SQL Server  ACID 属性
  • 详解SQL Server 中的 ACID 属性
    目录SQL Server 中的事务是什么?事务的 ACID 属性是什么?SQL Server 中事务的原子性SQL Server 中事务的一致性SQL Server 中事务的隔离性S...
    99+
    2024-04-02
  • SQL Server中的ACID属性是什么
    这篇文章主要讲解了“SQL Server中的ACID属性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server中的ACID属性是什么”吧!SQL Ser...
    99+
    2023-07-02
  • DB2中的ACID属性是什么
    在DB2中,ACID属性是指数据库事务必须具备的四个特性,包括: 原子性(Atomicity):事务是一个不可分割的工作单位,要么...
    99+
    2024-03-07
    DB2
  • SQL中的事务ACID
    概述: 事务是由一系列语句构成的逻辑工作单元。事务和存储过程等批处理有一定程度上的相似之处, 通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使它们与其他语句之间出现一个逻辑上的边界,并形成相对独立的一个工作单元。 ...
    99+
    2017-12-30
    SQL中的事务ACID
  • SQL Server中的约束(constraints)详解
    目录一、约束的分类二、约束命名三、主键约束1、在创建表的时候创建主键约束。2、在已存在的表上创建主键约束3、复合主键的创建四、外键约束4.1、创建表的时候创建外键4.2、在已存在的表...
    99+
    2024-04-02
  • SQL Server中的约束(constraints)详解
    SQL Server中的约束是一种用于限制表中数据的规则。它们可以应用于列级别或表级别,并确保数据库中的数据遵循特定的规则和完整性要...
    99+
    2023-08-16
    SQL Server
  • Android中的windowSoftInputMode属性详解
        在前面的一篇文章中,简单的介绍了一下如何实现软键盘不自动弹出,使用的方法是设置android:windowSoftInputMode属性。...
    99+
    2022-06-06
    Android
  • 详解Spring中的Transactional属性
    目录一、Transactional二、使用说明三、注解失效问题一、Transactional 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创...
    99+
    2024-04-02
  • Vue中的computed属性详解
    目录插值表达式methodscomputed总结今天来说说vue中的计算属性computed,为了更好的理解计算属性的好处,我们先通过一个案例来慢慢 了解计算属性,有如下案例:定义两...
    99+
    2024-04-02
  • SQL Server中的数据类型详解
    目录哪些对象需要数据类型一、 整数数据类型1、bit2、tinyint3、smallint4、int (integer)5、bigint二、 浮点数据类型1、real: 近似数值型2...
    99+
    2024-04-02
  • SQL Server中索引的用法详解
    索引是一种数据结构,用于提高数据库中数据的查询效率。SQL Server中的索引可以分为聚集索引和非聚集索引两种类型。聚集索引决定了...
    99+
    2023-08-17
    SQL Server
  • css3中transition属性详解
    CSS3中的transition属性用于设置元素在一定时间内的过渡效果。它允许我们在元素的不同状态之间平滑地过渡,从而实现更加流畅的...
    99+
    2023-09-23
    css3
  • SQL中的ACID指的是什么
    本篇内容介绍了“SQL中的ACID指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  WAL的中心...
    99+
    2024-04-02
  • ACID 属性宝典:数据完整性的终极指南
    在数据库管理系统 (DBMS) 中,ACID 属性是数据完整性的基石,确保数据的准确性和可靠性。ACID 是一组四个相互关联的属性的缩写,包括: 原子性 (Atomicity):要么一个事务的所有操作都成功执行,要么一个都不执行。 一致...
    99+
    2024-04-02
  • 详解MySQL和SQL Server的特性及适用场景
    MySQL和SQL Server是两种常见的关系型数据库管理系统,它们在企业和个人应用中被广泛使用。本文将详细介绍MySQL和SQL Server的特性及适用场景,并提供具体的代码示例...
    99+
    2024-04-02
  • SQL Server中的XML数据类型详解
    目录一、创建测试数据,指定字段数据类型为XML1、创建表2、插入测试数据3、插入XML文件数据4、创建索引二、查询XML数据1、query(XPath条件):返回xml 类型的节点内...
    99+
    2024-04-02
  • SQL Server中JSON函数的用法详解
    目录一、 将查询结果输出JSON格式1、FOR JSON AUTO:SELECT语句的结果以JSON输出。2、FOR JSON AUTO,Root(’&rsquo...
    99+
    2024-04-02
  • 详解EFCore中的导航属性
    目录    1 单独使用Include  2 主清单使用Include  3 ThenInclude用法  4 IncludeFilter用法  5 特殊情况  ...
    99+
    2024-04-02
  • SQL Server的触发器详解
    目录一、概念二、使用触发器优缺点三、语法四、触发器类型1、数据操作语言 (DML) 触发器1、After触发器2、Instead of 触发器2、数据定义语言 (DDL) 触发器五、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作