1.什么是事務
為單個工作單元而執行的一系列操作。如查詢、修改數據、修改數據定義。
2.語法
(1)顯示定義事務的開始、提交
1 2 3 4 | BEGIN TRAN
Insert INTO b(t1) VALUES (1)
Insert INTO b(t1) VALUES (2)
COMMIT TRAN
|
(2)隱式定義
如果不顯示定義事務的邊界,則SQL Server會默認把每個單獨的語句作為一個事務,即在執行完每個語句之后就會自動提交事務。
3.事務的四個屬性ACID
(1)原子性Atomicity

1.事務必須是原子工作單元。事務中進行的修改,要么全部執行,要么全都不執行;
2.在事務完成之前(提交指令被記錄到事務日志之前),系統出現故障或重新啟動,SQL Server將會撤銷在事務中進行的所有修改;
3.事務在處理中遇到錯誤,SQL Server通常會自動回滾事務;
4.少數不太嚴重的錯誤不會引發事務的自動回滾,如主鍵沖突、鎖超時等;
5.可以使用錯誤處理來捕獲第4點提到的錯誤,并采取某種操作,如把錯誤記錄在日志中,再回滾事務;
6.Select @@TRANCOUNT可用在代碼的任何位置來判斷當前使用Select
@@TRANCOUNT的地方是否位于一個打開的事務當中,如果不在任何打開的事務范圍內,則該函數返回0;如果在某個打開的事務返回范圍內,則返回一個
大于0的值。打開一個事務,@@TRANCOUNT=@@TRANCOUNT+1;提交一個事務,@@TRANCOUNT-1。
(2)一致性Consiitency

1.同時發生的事務在修改和查詢數據時不發生沖突;
2.一致性取決于應用程序的需要。后面會講到一致性級別,以及如何對一致性進行控制。
(3)隔離性Isolation

1.用于控制數據訪問,確保事務只訪問處于期望的一致性級別下的數據;
2.使用鎖對各個事務之間正在修改和查詢的數據進行隔離。
(4)持久性Durability

1.在將數據修改寫入到磁盤上數據庫的數據分區之前會把這些修改寫入到磁盤上數據庫的事務日志中,把提交指令記錄到磁盤的事務日志中以后,及時數據修改還沒有應用到磁盤的數據分區,也可以認為事務時持久化的。
2.系統重新啟動(正常啟動或在發生系統故障之后啟動),SQL Server會每個數據庫的事務日志,進行回復處理。
3.恢復處理包含兩個階段:重做階段和撤銷階段。
4.前滾:在重做階段,對于提交指令已經寫入到日志的事務,但數據修改還沒有應用到數據分區的事務,數據庫引擎會重做這些食物所做的所有修改。
5.回滾:在撤銷階段,對于提交指令沒有寫入到日志中的事務,數據庫引擎會撤銷這些事務所做的修改。(這句話需要research,可能是不正確的。因為提交指令沒有寫入到數據分區,撤銷修改是指撤銷哪些修改呢???)