SQL Server 中的事務(wù)管理
SQL Server 中的事務(wù)是什么?
- 事務(wù)是應(yīng)該作為一個(gè)單元執(zhí)行的一組 SQL 語(yǔ)句。這意味著事務(wù)確保所有命令都成功或都不成功。如果事務(wù)中的命令之一失敗,則所有命令都失敗,并且在數(shù)據(jù)庫(kù)中修改的任何數(shù)據(jù)都將回滾。
比如您在做一個(gè)銀行轉(zhuǎn)賬操作,這涉及了2個(gè)操作, 扣款和收款, 必須保證這2個(gè)操作都成功,或者都失敗, 只把你的錢扣了,對(duì)方?jīng)]收到,肯定不行的 (有一個(gè)操作失敗了,都應(yīng)該回滾到初始狀態(tài))
如何在 SQL Server 中實(shí)現(xiàn)事務(wù)管理?
SQL Server 為我們提供了4個(gè)命令來實(shí)現(xiàn)管理事務(wù)
- 開啟事務(wù): begin transaction (可簡(jiǎn)寫為 begin tran, 表示事務(wù)已開始)
- 提交事務(wù): commit (表示事務(wù)已成功完成,自事務(wù)開始以來執(zhí)行的所有數(shù)據(jù)操作操作都提交到數(shù)據(jù)庫(kù),并釋放事務(wù)占用的資源。)
- 回滾事務(wù): rollback transaction (表示事務(wù)失敗,會(huì)將數(shù)據(jù)回滾到之前的狀態(tài)。)
- 保存事務(wù): save transaction (這用于將事務(wù)劃分為多個(gè)單元,以便用戶有機(jī)會(huì)將事務(wù)回滾到某個(gè)點(diǎn)或位置。)
在 SQL Server 中實(shí)現(xiàn)事務(wù)的示例:
請(qǐng)使用以下 SQL 腳本創(chuàng)建并使用所需的測(cè)試數(shù)據(jù)填充 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
一旦提交事務(wù),就不能回滾上述三個(gè)語(yǔ)句。提交事務(wù)后,現(xiàn)在您的產(chǎn)品將具有以下數(shù)據(jù)。
| 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 命令用于撤消尚未保存到數(shù)據(jù)庫(kù)中的事務(wù),并從事務(wù)開始處恢復(fù)到初始狀態(tài)。因此,如果您想將數(shù)據(jù)恢復(fù)到之前的狀態(tài),那么您需要在寫入 SQL 語(yǔ)句后的任何時(shí)間使用 ROLLBACK 命令,但請(qǐng)記住,一旦寫入 COMMIT ,我們就無法回滾數(shù)據(jù)。
請(qǐng)執(zhí)行以下語(yǔ)句以了解回滾命令。
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
當(dāng)您執(zhí)行上述事務(wù)并且您可以看到該事務(wù)未提交,您有機(jī)會(huì)使用 Rollback Transaction 命令回滾表上的所有操作。
了解 SQL Server 中的 @@Error 全局變量:
這是一個(gè)全局變量,我們可以使用這個(gè)變量來檢查是否有任何錯(cuò)誤。讓我們看一個(gè)例子來理解這一點(diǎn)。正如您在下面的示例中看到的,首先我們使用 Begin Transaction 語(yǔ)句啟動(dòng)事務(wù)。然后我們編寫兩個(gè)插入語(yǔ)句。然后我們使用全局系統(tǒng)變量@@ERROR 檢查是否有錯(cuò)誤。大于 0 的值意味著存在一些錯(cuò)誤。如果有一些錯(cuò)誤,那么我們回滾事務(wù),否則我們提交事務(wù)。
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
執(zhí)行上述事務(wù)后,您將看到事務(wù)回滾了。這是因?yàn)槲覀儑L試在主鍵列中插入重復(fù)值。
為什么我們需要 SQL Server 中的事務(wù)?
我們需要 SQL Server 中的事務(wù)來保護(hù)企業(yè)數(shù)據(jù)(使企業(yè)數(shù)據(jù)保持一致并實(shí)現(xiàn)數(shù)據(jù)完整性)。事務(wù)是對(duì)數(shù)據(jù)庫(kù)的一項(xiàng)或多項(xiàng)更改的傳播。例如,如果我們正在創(chuàng)建一條記錄或更新一條記錄,或者從表中刪除一條記錄,那么我們正在對(duì)表執(zhí)行事務(wù)。控制事務(wù)以確保數(shù)據(jù)完整性和處理數(shù)據(jù)庫(kù)錯(cuò)誤非常重要。
SQL Server 中事務(wù)的經(jīng)驗(yàn)法則是什么?
SQL Server 中的事務(wù)規(guī)則告訴事務(wù)中的所有語(yǔ)句都應(yīng)該成功執(zhí)行,或者這些語(yǔ)句都不執(zhí)行。

浙公網(wǎng)安備 33010602011771號(hào)