iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SQL Server中的ACID属性是什么
  • 926
分享到

SQL Server中的ACID属性是什么

2023-07-02 18:07:06 926人浏览 独家记忆
摘要

这篇文章主要讲解了“sql Server中的ACID属性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server中的ACID属性是什么”吧!SQL Ser

这篇文章主要讲解了“sql Server中的ACID属性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server中的ACID属性是什么”吧!

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.ProductIF OBJECT_ID('dbo.ProductSales','U') IS NOT NULL    DROP TABLE dbo.ProductSalesGoCREATE TABLE Product(  ProductID INT PRIMARY KEY,   Name VARCHAR(40),   Price INT,  Quantity INT )GOINSERT 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)GOCREATE TABLE ProductSales(  ProductSalesId INT PRIMARY KEY,  ProductId INT,  QuantitySold INT) GOINSERT 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 spSellProductGOCREATE PROCEDURE spSellProduct@ProductID INT,@QuantityToSell INTASBEGIN    -- 首先我们需要检查待销售产品的可用库存  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  EndEND

SQL Server 中事务的一致性

SQL Server 中事务的一致性确保数据库数据在事务开始之前处于一致状态,并且在事务完成后也使数据保持一致状态。如果事务违反规则,则应回滚。例如,如果可用库存从 Product 表中减少,那么 ProductSales 表中必须有一个相关条目。

在我们的示例中,假设事务更新了 product 表中的可用数量,突然出现系统故障(就在插入 ProductSales 表之前或中间)。在这种情况下系统会回滚更新,否则我们无法追踪库存信息。

SQL Server 中事务的隔离性

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

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

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

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

begin tranupdate 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&auml;rder 在 1983 年创建,然而,Jim Gray 在 1970 年代后期已经定义了这些属性。大多数流行的数据库,如 SQL Server、oracleMySQL、Postgre SQL 默认都遵循 ACID 属性。

感谢各位的阅读,以上就是“SQL Server中的ACID属性是什么”的内容了,经过本文的学习后,相信大家对SQL Server中的ACID属性是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: SQL Server中的ACID属性是什么

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c#文本框只读属性怎么设置
    c# 文本框只读属性的设置 问题:如何设置 C# 文本框的只读属性? 回答: 要设置文本框的只读属性,可以使用 ReadOnly 属性。 详细解释: ReadOnly 属性是一个布尔值属...
    99+
    2024-05-14
    c#
  • 如何使用 Golang ORM 工具与数据库交互?
    使用 gorm orm 工具与数据库交互,可通过以下步骤轻松实现:安装和初始化(1)、定义模型(2)、建立映射(3)、创建记录(4)、读取记录(5)、更新记录(6)、删除记录(7)、事务...
    99+
    2024-05-14
    golang orm mysql git iphone
  • c++中double与float的区别
    c++++ 中 double 与 float 的区别 在 C++ 中,double 和 float 都是浮点数类型,但它们在精度、范围和内存占用方面存在差异。 精度: double:双...
    99+
    2024-05-14
    c++ 内存占用
  • 如何在 Golang 中处理数据库错误?
    在 go 中处理数据库错误的步骤包括:使用专门的 go mysql 驱动程序。实现 error 接口以创建自定义错误。检测错误,记录足够的信息,并基于错误类型执行适当的恢复操作。 如何...
    99+
    2024-05-14
    golang 数据库错误 mysql git 数据丢失
  • c++中int怎么转string
    在 c++ 中将 int 转换为 string 的方法有:使用 to_string() 函数直接转换。使用 stringstream 类。使用 sprintf() 函数。 如何在 C+...
    99+
    2024-05-14
    c++
  • 优化 C++ 服务器架构以提高吞吐量
    优化 c++++ 服务器吞吐量策略:线程池:预先创建线程池,快速响应请求。非阻塞 i/o:在等待 i/o 时执行其他任务,提升吞吐量。http/2:使用二进制协议,支持多路复用和内容压缩...
    99+
    2024-05-14
    优化 服务器架构 c++
  • 使用 C++ 堆分配器管理服务器架构中的内存
    使用 c++++ 堆分配器管理服务器内存可提高性能和稳定性。堆分配器负责分配和释放动态内存,跟踪空闲/已分配内存元数据。在服务器架构中,它用于分配应用程序对象、缓冲区和数据结构。选择堆分...
    99+
    2024-05-14
    c++ 内存管理 并发访问
  • c#怎么获取字符串中的数字
    从 c# 字符串中提取数字的方法有五种:正则表达式、循环和 char.isdigit()、int.tryparse()、string.split() 和 int.parse()、linq...
    99+
    2024-05-14
    git c#
  • C++ 异常处理在服务器架构中的最佳实践
    c++++ 异常处理在服务器架构的最佳实践:定义清晰的异常层次结构,使用自定义异常类型封装相关信息。使用异常安全函数,及时在适当范围内处理异常。提供有意义的错误消息,帮助用户了解错误并采...
    99+
    2024-05-14
    c++ 异常处理
  • c#怎么拼接字符串
    在 c# 中拼接字符串有三种方法:使用加法(+)运算符、string.concat() 方法和 stringbuilder 类。最简单的方法是使用 + 运算符将字符串连接起来,...
    99+
    2024-05-14
    c#
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作