根據自身 Sql Server 的狀況來自定義 事務隔離級別,將會更加的知足需求,或提高性能。例如,對於邏輯簡單的 Sql Server,徹底可使用 read uncommitted 模式,來減小死鎖,減小堵塞, 提高性能和響應。對於此種應用場景應該是蠻多的,可是卻沒有一個全局設置,你妹呀! sql
這個功能真的很強大,可是不知道微軟爲何把它的最大做用域定義爲 當前連接,蛋疼,真的很蛋疼,無法全局設置,下面也儘量詳細的解釋如何少設置,多舒服的使用吧 數據庫
查看 當前 Sql Server 事務隔離級別 的設置: 併發
DBCC Useroptions -> isolation level 這一項的 Value 既是當前的設置值 性能
可是我不得不說,這個命令幾乎是廢物,爲何呢,由於 事務隔離級別 的做用域是 當前連接,也就是,你查看的是當前連接的 級別,可是sql server 同時 150+ 個連接是很正常的,其餘連接呢,你說蛋疼不,我X spa
設置Sql Server 事務隔離級別 .net
Sql Server 事務隔離級別 的設置也一樣很蛋疼,很糾結,很噁心。可是稍微好一點的是,其設置能夠在多個場合,多種方式設置,稍微彌補了一點點. 版本控制
1. Transact-SQL 語句中的設置 code
就是在當前 SQL 語句中,設置的事務隔離級別隻影響當前 sql 語句, 有兩種方式: orm
-- the first method select * from Table1 with(nolock) -- the second method SET TRANSACTION ISOLATION LEVEL Read UnCommitted; select * from Table1
這種方式比較靈活,能夠重點語句重點對待,缺點就是 要設置的實在是太多了,由於這種方式的做用域實在是過小了啊啊啊啊 server
2. ADO.NET 中的設置
使用 System.Data.SqlClient 託管命名空間的 ADO.NET 應用程序能夠調用 SqlConnection.BeginTransaction 方法並將 IsolationLevel 選項設置爲 Unspecified、Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable 或 Snapshot。
就是 SqlConnection 中設置了,代碼以下:
System.Data.SqlClient.SqlConnection con = new SqlConnection(); con.BeginTransaction(IsolationLevel.ReadUncommitted);
這種方式有點就是做用域範圍變大了;缺點就是要在 C# 設置,最要命的是,若是用了ORM,如何讓我設置!!!!!!!!!!!!!
固然,還有其餘的設置,詳情請參考:調整事務隔離級別
這就是蛋疼的功能,如此好的功能,卻如此蛋疼的設置,沒有一個全局的設置,強烈建議 微軟 把 事務隔離級別 的設置放到 sp_configure 裏面去
Sql Server 事務隔離級別的解釋:
事務指定一個隔離級別,該隔離級別定義一個事務必須與其餘事務所進行的資源或數據更改相隔離的程度。隔離級別從容許的併發反作用(例如,髒讀或幻讀)的角度進行描述。
事務隔離級別控制:
讀取數據時是否佔用鎖以及所請求的鎖類型。
佔用讀取鎖的時間。
引用其餘事務修改的行的讀取操做是否:
在該行上的排他鎖被釋放以前阻塞其餘事務。
檢索在啓動語句或事務時存在的行的已提交版本。
讀取未提交的數據修改。
選擇事務隔離級別不影響爲保護數據修改而獲取的鎖。事務老是在其修改的任何數據上獲取排他鎖並在事務完成以前持有該鎖,無論爲該事務設置了什麼樣的隔離級別。對於讀取操做,事務隔離級別主要定義保護級別,以防受到其餘事務所作更改的影響。
較低的隔離級別能夠加強許多用戶同時訪問數據的能力,但也增長了用戶可能遇到的併發反作用(例如髒讀或丟失更新)的數量。相反,較高的隔離級別減小了用戶可能遇到的併發反作用的類型,但須要更多的系統資源,並增長了一個事務阻塞其餘事務的可能性。應平衡應用程序的數據完整性要求與每一個隔離級別的開銷,在此基礎上選擇相應的隔離級別。最高隔離級別(可序列化)保證事務在每次重複讀取操做時都能準確檢索到相同的數據,但須要經過執行某種級別的鎖定來完成此操做,而鎖定可能會影響多用戶系統中的其餘用戶。最低隔離級別(未提交讀)能夠檢索其餘事務已經修改、但未提交的數據。在未提交讀中,全部併發反作用均可能發生,但由於沒有讀取鎖定或版本控制,因此開銷最少。
ISO 標準定義了下列隔離級別,SQL Server 數據庫引擎支持全部這些隔離級別:
未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的數據)
已提交讀(數據庫引擎的默認級別)
可重複讀
可序列化(隔離事務的最高級別,事務之間徹底隔離)
隔離級別 |
髒讀 |
不可重複讀 |
幻讀 |
---|---|---|---|
未提交讀 |
是 |
是 |
是 |
已提交讀 |
否 |
是 |
是 |
可重複讀 |
否 |
否 |
是 |
快照 |
否 |
否 |
否 |
可序列化 |
否 |
否 |
否 |