亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL Server:池連接之間的隔離級別泄漏

SQL Server:池連接之間的隔離級別泄漏

大話西游666 2019-10-26 13:15:51
正如先前的堆棧溢出問題(TransactionScope和連接池以及SqlConnection如何管理IsolationLevel?)所證明的那樣,事務隔離級別在與SQL Server和ADO.NET(以及System.Transactions和EF的池連接)之間泄漏,因為它們建立在ADO.NET)。這意味著在任何應用程序中都可能發生以下危險的事件序列:請求發生,需要顯式事務以確保數據一致性其他任何不使用顯式事務的請求都會出現,因為它僅在執行非關鍵讀取。現在,該請求將以可序列化的方式執行,從而可能導致危險的阻塞和死鎖問題:預防這種情況的最佳方法是什么?現在真的需要在任何地方使用顯式事務嗎?這是一個自包含的副本。您將看到第三個查詢將繼承第二個查詢的可序列化級別。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條經驗 獲得超4個贊

在SQL Server 2014中,此問題似乎已得到解決。如果使用TDS協議7.3或更高版本。


在SQL Server 12.0.2000.8版上運行,輸出為:


ReadCommitted

Serializable

ReadCommitted

不幸的是,此更改未在任何文檔中提及,例如:


SQL Server 2014中數據庫引擎功能的行為更改

SQL Server 2014中數據庫引擎功能的重大更改

但是更改已記錄在Microsoft論壇上。


不幸的是,此問題后來在SQL Server 2014 CU6和SQL Server 2014 SP1 CU1中“未修復”,因為它引入了一個錯誤:


FIX:在SQL Server 2014中發布SQL Server連接時,錯誤地重置了事務隔離級別


“假定您在SQL Server客戶端源代碼中使用TransactionScope類,并且沒有在事務中顯式打開SQL Server連接。釋放SQL Server連接后,將不正確地重置事務隔離級別?!?/p>


查看完整回答
反對 回復 2019-10-26
  • 3 回答
  • 0 關注
  • 611 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號