SQL Server 中的事務是什麼? 事務是應該作為一個單元執行的一組 SQL 語句。這意味著事務確保所有命令都成功或都不成功。如果事務中的命令之一失敗,則所有命令都失敗,並且在資料庫中修改的任何數據都將回滾。 比如您在做一個銀行轉賬操作,這涉及了2個操作, 扣款和收款, 必須保證這2個操作都成功 ...
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 中的事務規則告訴事務中的所有語句都應該成功執行,或者這些語句都不執行。