国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

詳解SQL Server 中的 ACID 屬性

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

SQL Server 中的事務是什么?

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

事務的 ACID 屬性是什么?

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

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

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

Product (產品表)

ProductIDNamePriceQuantity101Laptop15000100102Desktop20000150104Mobile3000200105Tablet4000250

ProductSales (產品銷售表)

ProductSalesIDProductIDQuantitySold110110210215310430410535

請使用以下 SQL 腳本創(chuàng)建并使用示例數(shù)據填充 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 語句失敗,數(shù)據庫應該通過回滾來撤消 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

  --如果可用庫存小于要銷售的數(shù)量,拋出錯誤
  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

      -- 把銷售的產品數(shù)量記錄到ProductSales表中
      INSERT INTO ProductSales VALUES (@MaxProductSalesId, @ProductId, @QuantityToSell)

      -- 最后,提交事務
      COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
      -- 如果發(fā)生了異常,回滾事務
      ROLLBACK TRANSACTION
    END CATCH

  End
END

SQL Server 中事務的一致性

SQL Server 中事務的一致性確保數(shù)據庫數(shù)據在事務開始之前處于一致狀態(tài),并且在事務完成后也使數(shù)據保持一致狀態(tài)。如果事務違反規(guī)則,則應回滾。例如,如果可用庫存從 Product 表中減少,那么 ProductSales 表中必須有一個相關條目。

在我們的示例中,假設事務更新了 product 表中的可用數(shù)量,突然出現(xiàn)系統(tǒng)故障(就在插入 ProductSales 表之前或中間)。在這種情況下系統(tǒng)會回滾更新,否則我們無法追蹤庫存信息。

SQL Server 中事務的隔離性

SQL Server 中事務的隔離性確保事務的中間狀態(tài)對其他事務不可見。一個事務所做的數(shù)據修改必須與所有其他事務所做的數(shù)據修改隔離。大多數(shù)數(shù)據庫使用鎖定來維護事務隔離。

為了理解事務的隔離性,我們將使用兩個獨立的 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

你會發(fā)現(xiàn),第2個窗口中的查詢語句被阻塞了(一直處于運行狀態(tài),沒有返回數(shù)據)

解決阻塞: 切換到第1個窗口, (按下鼠標左鍵拖動選擇 rollback tran ,注意不包含注釋 -- ),
然后單獨執(zhí)行這個語句, 在 sqlserver management studio 直接點擊執(zhí)行就行, 在 Navicat 中,點擊運行按鈕右邊的下拉箭頭,點擊運行已選擇的,好了,再切換到第2個窗口,你會發(fā)現(xiàn)結果出來了

阻塞的原因: SqlServer默認的事務隔離級別是 Read Committed,
在上述的Update語句執(zhí)行時會在對應的數(shù)據行上加一個 排它鎖(X), 直到事務提交或者回滾才會釋放,這保證了在此期間,其他任何事務都不能操作此行數(shù)據(查詢也不行),因為排它鎖(也叫獨占鎖),和其他類型的鎖都是不兼容的,這保證了其他事務看不到另一個事務的中間狀態(tài),即避免了臟讀

SQL Server 中事務的持久性

SQL Server 中事務的持久性確保一旦事務成功完成,它對數(shù)據庫所做的更改將是永久性的。即使出現(xiàn)系統(tǒng)故障或電源故障或任何異常變化,它也應該保護已提交的數(shù)據。

注意:首字母縮寫詞 ACID 由 Andreas Reuter 和 Theo Härder 在 1983 年創(chuàng)建,然而,Jim Gray 在 1970 年代后期已經定義了這些屬性。大多數(shù)流行的數(shù)據庫,如 SQL Server、Oracle、MySQL、Postgre SQL 默認都遵循 ACID 屬性。

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

標簽: MsSQL
主站蜘蛛池模板: 国产五区 | 真人真实毛片免费观看 | 欧美日一级 | 欧美成在线播放 | 午夜亚洲国产成人不卡在线 | 青青影院一区二区免费视频 | 热er99久久6国产精品免费 | 欧美日韩另类综合 | 亚洲综合日韩欧美一区二区三 | 亚洲看黄| 久久精品免观看国产成人 | 欧美成人高清 | 日韩在线免费 | 亚洲一二区 | 女性无套免费网站在线看 | 韩国一大片a毛片 | 国产精品久久久久一区二区 | 九九精品久久久久久噜噜 | 久久久久久99精品 | 在线观看日本www | 国产边打电话边做对白刺激 | 看一级特黄a大片日本片 | 老司机午夜精品网站在线观看 | 国产乱理片在线观看夜 | 亚洲第一区视频在线观看 | 美女视频很黄很a免费国产 美女视频黄.免费网址 | 国产一二三区在线 | 在线日本看片免费人成视久网 | 一级片免费网址 | 99er精品 | 日本成人三级 | 国产在线观看网址在线视频 | 国产成人精品亚洲 | 国产精品毛片va一区二区三区 | 欧美久草 | 一本久久道久久爱 | 一级做a爰片久久毛片潮喷 一级做a爰片久久毛片美女 | 欧美free性秘书xxxxhd | 欧美特黄一级高清免费的香蕉 | 精品国产欧美另类一区 | 日韩在线网 |