大話西游666
2019-10-26 13:15:51
正如先前的堆棧溢出問題(TransactionScope和連接池以及SqlConnection如何管理IsolationLevel?)所證明的那樣,事務(wù)隔離級別在與SQL Server和ADO.NET(以及System.Transactions和EF的池連接)之間泄漏,因為它們建立在ADO.NET)。這意味著在任何應(yīng)用程序中都可能發(fā)生以下危險的事件序列:請求發(fā)生,需要顯式事務(wù)以確保數(shù)據(jù)一致性其他任何不使用顯式事務(wù)的請求都會出現(xiàn),因為它僅在執(zhí)行非關(guān)鍵讀取?,F(xiàn)在,該請求將以可序列化的方式執(zhí)行,從而可能導致危險的阻塞和死鎖問題:預(yù)防這種情況的最佳方法是什么?現(xiàn)在真的需要在任何地方使用顯式事務(wù)嗎?這是一個自包含的副本。您將看到第三個查詢將繼承第二個查詢的可序列化級別。class Program{ static void Main(string[] args) { RunTest(null); RunTest(IsolationLevel.Serializable); RunTest(null); Console.ReadKey(); } static void RunTest(IsolationLevel? isolationLevel) { using (var tran = isolationLevel == null ? null : new TransactionScope(0, new TransactionOptions() { IsolationLevel = isolationLevel.Value })) using (var conn = new SqlConnection("Data Source=(local); Integrated Security=true; Initial Catalog=master;")) { conn.Open(); var cmd = new SqlCommand(@"select case transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'RepeatableRead' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' end as lvl, @@SPID from sys.dm_exec_sessions where session_id = @@SPID", conn); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("Isolation Level = " + reader.GetValue(0) + ", SPID = " + reader.GetValue(1)); } } if (tran != null) tran.Complete(); } }}輸出:Isolation Level = ReadCommitted, SPID = 51Isolation Level = Serializable, SPID = 51Isolation Level = Serializable, SPID = 51 //leaked!
3 回答

慕虎7371278
TA貢獻1802條經(jīng)驗 獲得超4個贊
在SQL Server 2014中,此問題似乎已得到解決。如果使用TDS協(xié)議7.3或更高版本。
在SQL Server 12.0.2000.8版上運行,輸出為:
ReadCommitted
Serializable
ReadCommitted
不幸的是,此更改未在任何文檔中提及,例如:
SQL Server 2014中數(shù)據(jù)庫引擎功能的行為更改
SQL Server 2014中數(shù)據(jù)庫引擎功能的重大更改
但是更改已記錄在Microsoft論壇上。
不幸的是,此問題后來在SQL Server 2014 CU6和SQL Server 2014 SP1 CU1中“未修復(fù)”,因為它引入了一個錯誤:
FIX:在SQL Server 2014中發(fā)布SQL Server連接時,錯誤地重置了事務(wù)隔離級別
“假定您在SQL Server客戶端源代碼中使用TransactionScope類,并且沒有在事務(wù)中顯式打開SQL Server連接。釋放SQL Server連接后,將不正確地重置事務(wù)隔離級別?!?/p>
添加回答
舉報
0/150
提交
取消