1. 程式人生 > >Sql Server 事務隔離級別的檢視及更改

Sql Server 事務隔離級別的檢視及更改

根據自身 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 methodselect
*from Table1 with(nolock) -- the second methodSETTRANSACTIONISOLATIONLEVELReadUnCommitted; 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 資料庫引擎支援所有這些隔離級別:

未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的資料)

已提交讀(資料庫引擎的預設級別)

可重複讀

可序列化(隔離事務的最高級別,事務之間完全隔離)

隔離級別

髒讀

不可重複讀

幻讀

未提交讀

已提交讀

可重複讀

快照

可序列化