SQLServer事务的隔离级别
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                SQLServer事务的隔离级别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            事務的隔離級別  SQL Server通過在鎖資源上使用不同類型的鎖來隔離事務。為了開發安全的事務,定義事務內容以及應在何種情況下回滾至關重要,定義如何以及在多長時間內在事務中保持鎖定也同等重要。這由隔離級別決定。應用不同的隔離級別,SQL Server賦予開發者一種能力,讓他們為每一個單獨事務定義與其他事務的隔離程度。事務隔離級別的定義如下:  READ UNCOMMITTED  指定語句可以讀取已由其他事務修改但尚未提交的行。  在 READ UNCOMMITTED 級別運行的事務,不會發出共享鎖來防止其他事務修改當前事務讀取的數據。READ UNCOMMITTED 事務也不會被排他鎖阻塞,排他鎖會禁止當前事務讀取其他事務已修改但尚未提交的行。設置此選項之后,可以讀取未提交的修改,這種讀取稱為臟讀。在事務結束之前,可以更改數據中的值,行也可以出現在數據集中或從數據集中消失。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 NOLOCK 相同。這是隔離級別中限制最少的級別。  在 SQL Server 2005 中,您還可以使用下列任意一種方法,在保護事務不臟讀未提交的數據修改的同時盡量減少鎖定爭用:  1.? READ COMMITTED 隔離級別,并將 READ_COMMITTED_SNAPSHOT 數據庫選項設置為 ON。  2.? SNAPSHOT 隔離級別。  READ COMMITTED  指定語句不能讀取已由其他事務修改但尚未提交的數據。這樣可以避免臟讀。其他事務可以在當前事務的各個語句之間更改數據,從而產生不可重復讀取和幻像數據。該選項是 SQL Server 的默認設置。  READ COMMITTED 的行為取決于 READ_COMMITTED_SNAPSHOT 數據庫選項的設置:  1.? 如果將 READ_COMMITTED_SNAPSHOT 設置為 OFF(默認設置),則數據庫引擎 會使用共享鎖防止其他事務在當前事務執行讀取操作期間修改行。共享鎖還會阻止語句在其他事務完成之前讀取由這些事務修改的行。語句完成后便會釋放共享鎖。  2.? 如果將 READ_COMMITTED_SNAPSHOT 設置為 ON,則數據庫引擎 會使用行版本控制為每個語句提供一個在事務上一致的數據快照,因為該數據在語句開始時就存在。不使用鎖來防止其他事務更新數據。  當 READ_COMMITTED_SNAPSHOT 數據庫選項設置為 ON 時,您可以使用 READCOMMITTEDLOCK 表提示為 READ_COMMITTED 隔離級別上運行的事務中的各語句請求共享鎖,而不是行版本控制。  ????注意:設置 READ_COMMITTED_SNAPSHOT 選項時,數據庫中僅允許存在執行 ALTER DATABASE 命令的連接。在 ALTER DATABASE 完成之前,數據庫中不允許有其他打開的連接。數據庫不必處于單用戶模式。  SERIALIZABLE  請指定下列內容:  1.? 語句不能讀取已由其他事務修改但尚未提交的數據。  2.? 任何其他事務都不能在當前事務完成之前修改由當前事務讀取的數據。  3.? 在當前事務完成之前,其他事務不能使用當前事務中任何語句讀取的鍵值插入新行。  范 圍鎖處于與事務中執行的每個語句的搜索條件相匹配的鍵值范圍之內。這樣可以阻止其他事務更新或插入任何行,從而限定當前事務所執行的任何語句。這意味著如 果再次執行事務中的任何語句,則這些語句便會讀取同一組行。在事務完成之前將一直保持范圍鎖。這是限制最多的隔離級別,因為它鎖定了鍵的整個范圍,并在事 務完成之前一直保持范圍鎖。因為并發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。  需要注意的地方:  1.? 一次只能設置一個隔離級別選項,而且設置的選項將一直對那個連接始終有效,直到顯式更改該選項為止。事務中執行的所有讀取操作都會在指定的隔離級別的規則下運行,除非語句的 FROM 子句中的表提示為表指定了其他鎖定行為或版本控制行為。  2.? 事務隔離級別定義了可為讀取操作獲取的鎖類型。針對 READ COMMITTED 或 REPEATABLE READ 獲取的共享鎖通常為行鎖,盡管當讀取引用了頁或表中大量的行時,行鎖可以升級為頁鎖或表鎖。如果某行在被讀取之后由事務進行了修改,則該事務會獲取一個用于保護該行的排他鎖,并且該排他鎖在事務完成之前將一直保持。例如,如果 REPEATABLE READ 事務具有用于某行的共享鎖,并且該事務隨后修改了該行,則共享行鎖便會轉換為排他行鎖。  3.? 在事務進行期間,可以隨時將事務從一個隔離級別切換到另一個隔離級別,但有一種情況例外。即在從任一隔離級別更改到 SNAPSHOT 隔離時,不能進行上述操作。否則會導致事務失敗并回滾。但是,可以將在 SNAPSHOT 隔離中啟動的事務更改為任何其他隔離級別。  4.? 將事務從一個隔離級別更改為另一個隔離級別之后,便會根據新級別的規則對更改后讀取的資源執行保護。在更改前讀取的資源將繼續按照以前級別的規則受到保護。例如,如果某個事務從 READ COMMITTED 更改為 SERIALIZABLE,則在該事務結束前,更改后所獲取的共享鎖將一直處于保留狀態。  5.? 如果在存儲過程或觸發器中發出 SET TRANSACTION ISOLATION LEVEL,則當對象返回控制時,隔離級別會重設為在調用對象時有效的級別。例如,如果在批處理中設置 REPEATABLE READ,并且該批處理調用一個將隔離級別設置為 SERIALIZABLE 的存儲過程,則當該存儲過程將控制返回給該批處理時,隔離級別就會恢復為 REPEATABLE READ。 
 
                        
                        
                        - 是否在讀數據的時候使用鎖
- 讀鎖持續多長時間
- 在讀數據的時候使用何種類型的鎖
- 讀操作希望讀已經被其他事務排他鎖住的數據時,怎么辦?在這種情況下,SQL Server可以: - 一直等到其他事務釋放鎖
- 讀沒有提交的數據
- 讀數據最后提交后的版本
 
- 未提交讀 在讀數據時不會檢查或使用任何鎖。因此,在這種隔離級別中可能讀取到沒有提交的數據。
- 已提交讀 只讀取提交的數據并等待其他事務釋放排他鎖。讀數據的共享鎖在讀操作完成后立即釋放。已提交讀是SQL Server的默認隔離級別。
- 可重復讀 像已提交讀級別那樣讀數據,但會保持共享鎖直到事務結束。
- 可序列化 工作方式類似于可重復讀。但它不僅會鎖定受影響的數據,還會鎖定這個范圍。這就阻止了新數據插入查詢所涉及的范圍,這種情況可以導致幻像讀。
- 已提交讀快照 它是一種提交讀級別的新實現。不像一般的提交讀級別,SQL Server會讀取最后提交的版本并因此不必在進行讀操作時等待直到鎖被釋放。這個級別可以替代提交讀級別。
- 快照 這種隔離使用行版本來提供事務級別的讀取一致性。這意味著在一個事務中,由于讀一致性可以通過行版本控制實現,因此同樣的數據總是可以像在可序列化級別上一樣被讀取而不必為防止來自其他事務的更改而被鎖定。
轉載于:https://blog.51cto.com/xu20cn/66109
總結
以上是生活随笔為你收集整理的SQLServer事务的隔离级别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Excel分列功能的妙用
- 下一篇: SAP项目文档 清单 考核标准
