SQL Server 中的事務是什麼?
- 事務是應該作為一個單元執行的一組 SQL 語句。這意味着事務確定所有指令都成功或都不成功。如果事務中的指令之一失敗,則所有指令都失敗,并且在資料庫中修改的任何資料都将復原。
比如您在做一個銀行轉賬操作,這涉及了2個操作, 扣款和收款, 必須保證這2個操作都成功,或者都失敗, 隻把你的錢扣了,對方沒收到,肯定不行的 (有一個操作失敗了,都應該復原到初始狀态)
如何在 SQL Server 中實作事務管理?
SQL Server 為我們提供了4個指令來實作管理事務
- 開啟事務: begin transaction (可簡寫為 begin tran, 表示事務已開始)
- 送出事務: commit (表示事務已成功完成,自事務開始以來執行的所有資料操作操作都送出到資料庫,并釋放事務占用的資源。)
- 復原事務: rollback transaction (表示事務失敗,會将資料復原到之前的狀态。)
- 儲存事務: 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 中的事務規則告訴事務中的所有語句都應該成功執行,或者這些語句都不執行。