成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

詳解SQL Server 中的 ACID 屬性

瀏覽:227日期: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
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
蜜桃精品视频在线观看| 在线观看成人av电影| 激情五月***国产精品| 精品精品国产高清a毛片牛牛 | 欧美一区二区三区四区五区| 免费一级片91| 色噜噜狠狠色综合中国| 午夜精品福利久久久| 亚洲综合国产| 天天综合天天做天天综合| 国产一区二区黄色| 亚洲一区影音先锋| 性伦欧美刺激片在线观看| 亚洲精品成人精品456| 日韩亚洲一区在线播放| 亚洲视频一二区| 狠狠噜噜久久| 中文字幕一区二区5566日韩| 国内精品久久国产| 国产精品美女久久久久av爽李琼| 女女同性精品视频| 日本一区二区三区久久久久久久久不 | √…a在线天堂一区| 亚洲视频中文| 亚洲乱码国产乱码精品精的特点 | 麻豆91精品91久久久的内涵| 欧美日韩高清一区二区不卡| 国产在线国偷精品免费看| 日韩一区二区三区视频在线| 国产精品99久久久久久宅男| 精品卡一卡二卡三卡四在线| 91在线精品一区二区| 欧美激情在线看| 最新日韩欧美| 亚洲国产精品久久人人爱蜜臀| 老司机一区二区三区| 日本中文字幕不卡| 欧美肥大bbwbbw高潮| 北条麻妃一区二区三区| 久久久不卡网国产精品二区| 亚洲一级黄色| 亚洲成人资源网| 欧美午夜精品一区二区三区| 国产91精品久久久久久久网曝门 | 欧美一区二区三区人| www.亚洲免费av| 国产精品三级电影| 国产欧美一区二区视频| 丝袜亚洲另类欧美综合| 制服丝袜成人动漫| 91日韩一区二区三区| 亚洲欧洲成人自拍| 香蕉久久久久久久av网站| 黄色小说综合网站| 国产亚洲欧洲997久久综合| 99xxxx成人网| 日韩av不卡一区二区| 欧美精品国产精品| 色综合婷婷久久| 亚洲乱码一区二区三区在线观看| 色婷婷综合久久| 成人深夜福利app| 成人欧美一区二区三区黑人麻豆 | 亚洲精品在线三区| 亚洲三级影院| 蜜臀久久99精品久久久画质超高清| 欧美一区二区三区在线视频| 欧美另类高清视频在线| 亚洲一区二区av在线| 欧美日韩大陆一区二区| 91丨九色porny丨蝌蚪| 亚洲中国最大av网站| 欧美日韩免费电影| 欧美在线资源| 石原莉奈一区二区三区在线观看| 欧美大黄免费观看| 宅男噜噜噜66国产日韩在线观看| 久久99精品一区二区三区三区| www国产精品av| 久久不射网站| 成人综合婷婷国产精品久久蜜臀 | 激情综合激情| 麻豆精品一区二区综合av| 久久综合久久综合亚洲| 免费视频久久| 99久久精品免费观看| 亚洲国产日韩一区二区| 日韩精品中午字幕| 亚洲看片网站| 国产99一区视频免费| 亚洲综合色视频| 精品国产一二三| 久久狠狠久久综合桃花| 99精品视频中文字幕| 日韩黄色在线观看| 2023国产一二三区日本精品2022| 久久不射网站| 色综合久久中文综合久久牛| 免费观看日韩av| 国产精品久久久久影院亚瑟| 欧美日韩一卡二卡| 亚洲第一网站| 国产成人8x视频一区二区| 亚洲精品日韩专区silk| 日韩视频一区二区三区在线播放| 国产精品久久久久久久久久直播 | 欧美激情aⅴ一区二区三区| 看片网站欧美日韩| 亚洲欧美国产77777| 精品粉嫩超白一线天av| 91极品美女在线| 合欧美一区二区三区| 国产成人av电影在线| 水野朝阳av一区二区三区| 中文字幕乱码亚洲精品一区| 91精品国产综合久久香蕉的特点| 国产精品毛片| 欧美人与禽猛交乱配| 国产一区二区剧情av在线| 亚洲一区二区三区在线播放| 国产亚洲精品超碰| 欧美日韩国产电影| 美女国产精品| 影音先锋国产精品| 不卡av在线免费观看| 久久99精品一区二区三区三区| 亚洲男人的天堂一区二区| 久久你懂得1024| 91久久香蕉国产日韩欧美9色| 激情一区二区三区| 成人av免费观看| 精品在线播放免费| 亚洲电影第三页| 亚洲色图欧美在线| 国产网站一区二区| 欧美一区二区三区免费视频| 色婷婷香蕉在线一区二区| 一本色道久久综合一区| 欧美日韩少妇| 91麻豆成人久久精品二区三区| 国精产品一区一区三区mba桃花| 亚洲国产一区二区a毛片| 国产精品欧美经典| 久久精品欧美日韩| 欧美一卡在线观看| 欧美日韩成人综合天天影院| 久久中文在线| 国产亚洲在线| 亚洲精品免费观看| 欧美日韩一区二| 91美女蜜桃在线| 成人午夜在线免费| 国产精品资源网站| 久久精工是国产品牌吗| 无码av中文一区二区三区桃花岛| 亚洲色图.com| 国产人久久人人人人爽| 欧美精品一区二区三区蜜臀| 91精品欧美久久久久久动漫| 欧美人xxxx| 在线不卡欧美精品一区二区三区| 欧美在线高清视频| 一本大道久久a久久综合| 国产日韩精品久久| 亚洲日韩视频| 亚洲裸体俱乐部裸体舞表演av| 亚洲国产精选| 99热这里只有成人精品国产| 亚洲激情网站| 国产日韩久久| 国产亚洲一区在线| 国产欧美日本在线| 国产一区二区久久久| 国产欧美日韩伦理| 亚洲欧美日韩综合国产aⅴ| 国产午夜精品一区二区三区欧美 | 欧美国产在线观看| 国产精品蜜臀av| 国产精品久久久久久久岛一牛影视 | 91色婷婷久久久久合中文| av一二三不卡影片| 成人国产精品免费网站| 粉嫩在线一区二区三区视频| 国产成a人亚洲| 99re热这里只有精品免费视频| 色综合久久综合网欧美综合网| 欧美日韩系列| 亚洲精选91| 亚洲永久免费| 色婷婷综合久久久| 欧美高清性hdvideosex| 日韩精品一区二| 久久精品水蜜桃av综合天堂| 国产精品视频一二三区| 亚洲欧美日韩小说| 亚洲午夜久久久久久久久电影网 | 欧美午夜视频| 99精品国产在热久久| 久久国产高清| 欧美日韩一区二区三区免费看|