天天看點

SQL Server 中的事務管理

作者:中年農碼工

SQL Server 中的事務是什麼?

  • 事務是應該作為一個單元執行的一組 SQL 語句。這意味着事務確定所有指令都成功或都不成功。如果事務中的指令之一失敗,則所有指令都失敗,并且在資料庫中修改的任何資料都将復原。
比如您在做一個銀行轉賬操作,這涉及了2個操作, 扣款和收款, 必須保證這2個操作都成功,或者都失敗, 隻把你的錢扣了,對方沒收到,肯定不行的 (有一個操作失敗了,都應該復原到初始狀态)

如何在 SQL Server 中實作事務管理?

SQL Server 為我們提供了4個指令來實作管理事務

  1. 開啟事務: begin transaction (可簡寫為 begin tran, 表示事務已開始)
  2. 送出事務: commit (表示事務已成功完成,自事務開始以來執行的所有資料操作操作都送出到資料庫,并釋放事務占用的資源。)
  3. 復原事務: rollback transaction (表示事務失敗,會将資料復原到之前的狀态。)
  4. 儲存事務: save transaction (這用于将事務劃分為多個單元,以便使用者有機會将事務復原到某個點或位置。)

在 SQL Server 中實作事務的示例:

請使用以下 SQL 腳本建立并使用所需的測試資料填充 Product 表。

IF OBJECT_ID('dbo.Product') IS NOT NULL
    DROP TABLE dbo.Product
GO
CREATE TABLE dbo.Product
(
    ProductID INT PRIMARY KEY, 
    Name VARCHAR(40), 
    Price INT,
    Quantity INT
)
GO
INSERT INTO Product VALUES(101, 'Product-1', 100, 10)
INSERT INTO Product VALUES(102, 'Product-2', 200, 15)
INSERT INTO Product VALUES(103, 'Product-3', 300, 20)
INSERT INTO Product VALUES(104, 'Product-4', 400, 25)
           

SQL Server 中的 COMMIT 示例。

BEGIN TRANSACTION
 INSERT INTO Product VALUES (105,'Product-5',500, 30)
 UPDATE Product SET Price = 350 WHERE ProductID = 103
 DELETE FROM Product WHERE ProductID = 103
COMMIT TRANSACTION
           

一旦送出事務,就不能復原上述三個語句。送出事務後,現在您的産品将具有以下資料。

ProductID Name Price Quantity
101 Product-1 100 10
102 Product-2 200 15
104 Product-4 400 25
105 Product-5 500 30

SQL Server 中的 ROLLBACK TRANSACTION 示例

SQL Server 中的 Rollback 指令用于撤消尚未儲存到資料庫中的事務,并從事務開始處恢複到初始狀态。是以,如果您想将資料恢複到之前的狀态,那麼您需要在寫入 SQL 語句後的任何時間使用 ROLLBACK 指令,但請記住,一旦寫入 COMMIT ,我們就無法復原資料。

請執行以下語句以了解復原指令。

BEGIN TRANSACTION
INSERT INTO Product VALUES(106,'Product-6',600, 30)
UPDATE Product SET Price =550 WHERE ProductID = 105
DELETE FROM Product WHERE ProductID = 104
           

當您執行上述事務并且您可以看到該事務未送出,您有機會使用 Rollback Transaction 指令復原表上的所有操作。

了解 SQL Server 中的 @@Error 全局變量:

這是一個全局變量,我們可以使用這個變量來檢查是否有任何錯誤。讓我們看一個例子來了解這一點。正如您在下面的示例中看到的,首先我們使用 Begin Transaction 語句啟動事務。然後我們編寫兩個插入語句。然後我們使用全局系統變量@@ERROR 檢查是否有錯誤。大于 0 的值意味着存在一些錯誤。如果有一些錯誤,那麼我們復原事務,否則我們送出事務。

BEGIN TRANSACTION
    INSERT INTO Product VALUES(110,'Product-10',600, 30)
    INSERT INTO Product VALUES(110,'Product-10',600, 30)
IF(@@ERROR > 0)
    BEGIN
        Rollback Transaction
    END
ELSE
    BEGIN
    Commit Transaction
    END
           

執行上述事務後,您将看到事務復原了。這是因為我們嘗試在主鍵列中插入重複值。

為什麼我們需要 SQL Server 中的事務?

我們需要 SQL Server 中的事務來保護企業資料(使企業資料保持一緻并實作資料完整性)。事務是對資料庫的一項或多項更改的傳播。例如,如果我們正在建立一條記錄或更新一條記錄,或者從表中删除一條記錄,那麼我們正在對表執行事務。控制事務以確定資料完整性和處理資料庫錯誤非常重要。

SQL Server 中事務的經驗法則是什麼?

SQL Server 中的事務規則告訴事務中的所有語句都應該成功執行,或者這些語句都不執行。

繼續閱讀