含義:
事務要有非常明確的開始和結束點,SQL Server 中的每一條數據操作語句,例如SELECT、INSERT、UPDATE和DELETE都是隱式事務的一部分。即使只有一條語句,系統也會把這條語句當做一個事務,要麼執行所有的語句,要麼什麼都不執行。
事務開始之後,事務所有的操作都會寫到事務日志中,寫到日志中的事務,一般有兩種:一是針對數據的操作,例如插入、修改和刪除,這些操作的對象是大量的數據;另一種是針對任務的操作,例如創建索引。當取消這些事務操作時,系統自動執行這些操作的反操作,保證系統的一致性。系統自動生成一個檢查點機制,這個檢查點周期的檢查事務日志。如果在事務日志中事務全部完成,那麼檢查點事務日志中的事務提交到數據庫中,並且在事務日志中做一個檢查點提交標識;如果在事務日志中,事務沒有完成,那麼檢查點不會將事務日志中的事務提交到數據庫中,並且在事務日志中做一個檢查點未提交的標識。事務的恢復及檢查點保證了系統的完整和可恢復。
事務的屬性:
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有4個屬性,稱為原子性(Atomic)、 一致性(Consistent)、隔離性(Isolated)、持久性(Durable),簡稱ACID屬性,只有這樣才能構成一個事務。
原子性:
整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:
在事務開始之前和事務結束以後,數據庫的完整性約束沒有被破壞。
隔離性:
兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。
持久性:
在事務完成以後,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。
由於一項操作通常會包含許多子操作,而這些子操作可能會因為硬件的損壞或其他因素產生問題,要正確實現ACID並不容易。ACID建議數據庫將所有需要更新 以及修改的資料一次操作完畢,但實際上並不可行。
事務管理的常用語句:
BEGIN TRANSACTION——建立一個事務
COMMITTRANSACTION——提交事務
ROLLBACK TRANSACTION——事務失敗時執行回滾操作
SAVE TRANSACTION——保存事務
BEGIN TRANSACTION 和COMMIT TRANSACTION同時使用,用來表示事務的開始和結束。
事務的隔離級別:
事務具有隔離性,不同事務中所使用的時間必須要和其他事務進行隔離,在同一時間可以有很多個事務正在處理數據,但是每個數據在同一時刻只能有一個事務進行操作。如果將數據鎖定,使用數據的事務就必須要排隊等待,這樣可以防止多個事務互相影響。但是如果有幾個事務因為鎖定了自己的數據,同時又在等待其他事務釋放數據,則造成死鎖。
為了提高數據的並發使用效率,可以為事務在讀取數據時設置隔離狀態,SQL Server 2012 中的事務隔離狀態由低到高分為5個級別。
未授權讀取
也稱為讀未提交(Read Uncommitted):允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個數據則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。
授權讀取
,也稱為讀提交(Read Committed):允許不可重復讀取,但不允許髒讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
可重復讀取
可重復讀取(Repeatable Read):禁止不可重復讀取和髒讀取,但是有時可能出現幻影數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
序列化
序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能並發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。