电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解SQL Server 中的 ACID 屬性

瀏覽:133日期:2023-03-06 14:25:15
目錄
  • SQL Server 中的事務是什么?
  • 事務的 ACID 屬性是什么?
  • SQL Server 中事務的原子性
  • SQL Server 中事務的一致性
  • SQL Server 中事務的隔離性
  • SQL Server 中事務的持久性

SQL Server 中的事務是什么?

SQL Server 中的事務是一組被視為一個單元的 SQL 語句,它們按照“做所有事或不做任何事”的原則執行,成功的事務必須通過 ACID 測試。

事務的 ACID 屬性是什么?

首字母縮寫詞 ACID 是指事務的四個關鍵屬性

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

為了理解這一點,我們將使用以下兩個表測試。

Product (產品表)

ProductIDNamePriceQuantity101Laptop15000100102Desktop20000150104Mobile3000200105Tablet4000250

ProductSales (產品銷售表)

ProductSalesIDProductIDQuantitySold110110210215310430410535

請使用以下 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、Oracle、MySQL、Postgre SQL 默認都遵循 ACID 屬性。

到此這篇關于SQL Server 中的 ACID 屬性的文章就介紹到這了,更多相關SQL Server ACID內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MsSQL
主站蜘蛛池模板: 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 模型公司_模型制作_沙盘模型报价-中国模型网 | 冷却塔厂家_冷却塔维修_冷却塔改造_凉水塔配件填料公司- 广东康明节能空调有限公司 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 回转炉,外热式回转窑,回转窑炉-淄博圣元窑炉工程有限公司 | 成都租车_成都租车公司_成都租车网_众行宝 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 上海诺狮景观规划设计有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 成都思迪机电技术研究所-四川成都思迪编码器 | 许昌奥仕达自动化设备有限公司 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 |