<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SQL Server 中的 ACID 屬性

      SQL Server 中的事務(wù)是什么?

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

      事務(wù)的 ACID 屬性是什么?

      首字母縮寫詞 ACID 是指事務(wù)的四個關(guān)鍵屬性

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

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

      Product (產(chǎn)品表)

      ProductID Name Price Quantity
      101 Laptop 15000 100
      102 Desktop 20000 150
      104 Mobile 3000 200
      105 Tablet 4000 250

      ProductSales (產(chǎn)品銷售表)

      ProductSalesID ProductID QuantitySold
      1 101 10
      2 102 15
      3 104 30
      4 105 35

      請使用以下 SQL 腳本創(chuàng)建并使用示例數(shù)據(jù)填充 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 中事務(wù)的原子性

      SQL Server 中事務(wù)的原子性確保事務(wù)中的所有 DML 語句(即插入、更新、刪除)成功完成或全部回滾。例如,在以下 spSellProduct 存儲過程中,UPDATE 和 INSERT 語句都應(yīng)該成功。如果 UPDATE 語句成功而 INSERT 語句失敗,數(shù)據(jù)庫應(yīng)該通過回滾來撤消 UPDATE 語句所做的更改。

      IF OBJECT_ID('spSellProduct','P') IS NOT NULL
          DROP PROCEDURE spSellProduct
      GO
      CREATE PROCEDURE spSellProduct
      @ProductID INT,
      @QuantityToSell INT
      AS
      BEGIN
        
        -- 首先我們需要檢查待銷售產(chǎn)品的可用庫存
        DECLARE @StockAvailable INT
        SELECT @StockAvailable = Quantity FROM Product WHERE ProductId = @ProductId
      
        --如果可用庫存小于要銷售的數(shù)量,拋出錯誤
        IF(@StockAvailable < @QuantityToSell)
        BEGIN
          Raiserror('可用庫存不足',16,1)
        END
      
        -- 如果可用庫存充足
        ELSE
        BEGIN
          BEGIN TRY
            -- 我們需要開啟一個事務(wù)
            BEGIN TRANSACTION
      
            -- 首先做減庫存操作
            UPDATE Product SET Quantity = (Quantity - @QuantityToSell) WHERE ProductID = @ProductID
      
            -- 計算當前最大的產(chǎn)品銷售ID,即 MaxProductSalesId
            DECLARE @MaxProductSalesId INT
            SELECT @MaxProductSalesId = CASE 
                WHEN MAX(ProductSalesId) IS NULL THEN 0 
                ELSE MAX(ProductSalesId) 
                END 
            FROM ProductSales
      
            -- 把 @MaxProductSalesId 加一, 所以我們會避免主鍵沖突 
            --(解釋下,建表的時候,沒有設(shè)置主鍵自增,所以需要人工處理自增)
            Set @MaxProductSalesId = @MaxProductSalesId + 1
      
            -- 把銷售的產(chǎn)品數(shù)量記錄到ProductSales表中
            INSERT INTO ProductSales VALUES (@MaxProductSalesId, @ProductId, @QuantityToSell)
      
            -- 最后,提交事務(wù)
            COMMIT TRANSACTION
          END TRY
      
          BEGIN CATCH
            -- 如果發(fā)生了異常,回滾事務(wù)
            ROLLBACK TRANSACTION
          END CATCH
      
        End
      END
      

      SQL Server 中事務(wù)的一致性

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

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

      SQL Server 中事務(wù)的隔離性

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

      為了理解事務(wù)的隔離性,我們將使用兩個獨立的 SQL Server 事務(wù)。從第一個事務(wù)開始,我們啟動了事務(wù)并更新了 Product 表中的記錄,但我們還沒有提交或回滾事務(wù)。在第二個事務(wù)中,我們使用 select 語句來選擇 Product 表中存在的記錄,如下所示。

      在sqlserver management studio 或 Navicat 中新建兩個獨立的查詢窗口

      首先在第1個窗口運行以下事務(wù),更新庫存(注意事務(wù)沒有提交或回滾,回滾語句被注釋了)

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

      然后在第2個窗口運行以下語句,查詢被更新的產(chǎn)品

      select * from dbo.Product where ProductID = 101
      

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

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

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

      SQL Server 中事務(wù)的持久性

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

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

      posted @ 2022-07-13 14:22  Broadm  閱讀(766)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品成人网页视频在线 | 国产精品一区二区三区三级| 内射极品少妇xxxxxhd| 国产自拍偷拍视频在线观看| 看全色黄大黄大色免费久久 | 国产成人高清亚洲综合| 麻豆天美东精91厂制片| 农村老熟妇乱子伦视频| 1024你懂的国产精品| 国产自拍在线一区二区三区| a片在线免费观看| 人妻精品久久无码区 | 粗大猛烈进出高潮视频| 日本精品不卡一二三区| 精品亚洲综合一区二区三区| 国产成人精品视频不卡| 四虎在线成人免费观看| 野外做受三级视频| 亚洲人成电影网站色mp4| 精品福利一区二区三区免费视频| 中文字幕无码成人免费视频| 午夜夫妻试看120国产| 欧美极品色午夜在线视频| 日本国产精品第一页久久| 97人妻免费碰视频碰免| 久久精品日日躁夜夜躁 | 久久这里只有精品首页| 成人综合人人爽一区二区| 99国产欧美另类久久久精品| 中文区中文字幕免费看| 久久精品国产亚洲av麻豆长发| 亚洲成熟女人av在线观看| 久久精品亚洲热综合一区二区| 清苑县| 男人猛躁进女人免费播放| 国内精品久久久久影院蜜芽| 东京热人妻无码一区二区av| 国产精品伊人久久综合网| 色偷偷久久一区二区三区| 国产首页一区二区不卡| 欧美野外伦姧在线观看|