根據自身 Sql Server 的情況來自訂 交易隔離等級,將會更加的滿足需求,或提升效能。例如,對於邏輯簡單的 Sql Server,完全可以使用 read uncommitted 模式,來減少死結,減少堵塞, 提升效能和響應。對於此種應用情境應該是蠻多的,但是卻沒有一個全域設定,你妹呀!
這個功能真的很強大,但是不知道微軟為什麼把它的最大範圍定義為 當前連結,蛋疼,真的很蛋疼,沒法全域設定,下面也儘可能詳細的解釋如何少設定,多舒服的使用吧
查看 當前 Sql Server 交易隔離等級 的設定:
DBCC Useroptions -> isolation level 這一項的 Value 既是當前的設定值
但是我不得不說,這個命令幾乎是廢物,為什麼呢,因為 交易隔離等級 的範圍是 當前連結,也就是,你查看的是當前連結的 層級,但是sql server 同時 150+ 個連結是很正常的,其他連結呢,你說蛋疼不,我X
設定Sql Server 交易隔離等級
Sql Server 交易隔離等級 的設定也同樣很蛋疼,很糾結,很噁心。但是稍微好一點的是,其設定可以在多個場合,多種方式設定,稍微彌補了一點點.
1. Transact-SQL 陳述式中的設定
就是在當前 SQL 陳述式中,設定的交易隔離等級隻影響當前 sql 語句, 有兩種方式:
-- the first method
select * from Table1 with(nolock)
-- the second method
SET TRANSACTION ISOLATION LEVEL Read UnCommitted;
select * from Table1
這種方式比較靈活,可以重點語句重點對待,缺點就是 要設定的實在是太多了,因為這種方式的範圍實在是太小了啊啊啊啊
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 資料庫引擎支援所有這些隔離等級:
未提交讀(隔離事務的最低層級,只能保證不讀取物理上損壞的資料)
已提交讀(資料庫引擎的預設層級)
可重複讀
可序列化(隔離事務的最進階別,事務之間完全隔離)
隔離等級 |
髒讀 |
不可重複讀取 |
幻讀 |
未提交讀 |
是 |
是 |
是 |
已提交讀 |
否 |
是 |
是 |
可重複讀 |
否 |
否 |
是 |
快照 |
否 |
否 |
否 |
可序列化 |
否 |
否 |
否 |