事務檢視原始碼討論檢視歷史
事務 | |
---|---|
事務,一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
計算機中的事務
概念
例如:在關係數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。[1]
特性
事務是恢復和並發控制的基本單位。[2]
事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
事務類型
(1)手動事務
手動事務允許顯式處理若干過程,這些過程包括:開始事務、控制事務邊界內的每個連接和資源登記、確定事務結果(提交或中止)以及結束事務。儘管此模型提供了對事務的標準控制,但它缺少一些內置於自動事務模型的簡化操作。例如,在手動事務中數據存儲區之間沒有自動登記和協調。此外,與自動事務不同,手動事務中事務不在對象間流動。
如果選擇手動控制分布式事務,則必須管理恢復、並發、安全性和完整性。也就是說,必須應用維護與事務處理關聯的 ACID 屬性所需的所有編程方法。
(2)自動事務
.NET 頁、XML Web services方法或 .NET Framework 類一旦被標記為參與事務,它們將自動在事務範圍內執行。您可以通過在頁、XML Web services 方法或類中設置一個事務屬性值來控制對象的事務行為。特性值反過來確定實例化對象的事務性行為。因此,根據聲明特性值的不同,對象將自動參與現有事務或正在進行的事務,成為新事務的根或者根本不參與事務。聲明事務屬性的語法在 .NET Framework 類、.NET 頁和 XML Web services 方法中稍有不同。
聲明性事務特性指定對象如何參與事務,如何以編程方式被配置。儘管此聲明性級別表示事務的邏輯,但它是一個已從物理事務中移除的步驟。物理事務在事務性對象訪問數據庫或消息隊列這樣的數據資源時發生。與對象關聯的事務自動流向合適的資源管理器,諸如 OLE DB、開放式數據庫連接 (ODBC) 或 ActiveX 數據對象 (ADO) 的關聯驅動程序在對象的上下文中查找事務,並通過分布式事務處理協調器 (DTC) 在此事務中登記。整個物理事務自動發生。
例:
……關鍵語句講解………
BEGIN TRANSACTION
/*--定義變量,用於累計事務執行過程中的錯誤--*/
DECLARE @errorSum INT
SET @errorSum=0 --初始化為0,即無錯誤
/*--轉賬:張三的賬戶少1000元,李四的賬戶多1000元*/
UPDATEbankSET currentMoney=currentMoney-1000
WHERE customerName='張三'
SET @errorSum=@errorSum+@@error
UPDATE bank SET currentMoney=currentMoney+1000
WHERE customerName='李四'
SET @errorSum=@errorSum+@@error --累計是否有錯誤
IF @errorSum<>0 --如果有錯誤
BEGIN
print '交易失敗,回滾事務'
ROLLBACK TRANSACTION
END?
ELSE
BEGIN
print '交易成功,提交事務,寫入硬盤,永久的保存'
COMMIT TRANSACTION
END
GO
print '查看轉賬事務後的餘額'
SELECT * FROM bank?
GO