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