中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET中怎么實現不可重復讀與幻讀

發布時間:2021-06-23 17:02:29 來源:億速云 閱讀:126 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關.NET中怎么實現不可重復讀與幻讀,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

并發可能產生的三種問題

臟讀

定義:A事務執行過程中B事務讀取了A事務的修改,但是A事務并沒有結束(提交),A事務后來可能成功也可能失敗。

比喻:A修改了源代碼并且并沒有提交到源代碼系統,A直接通過QQ將代碼發給了B,A后來取消了修改。

代碼示例

復制代碼 代碼如下:


[TestMethod]
         public void 臟讀_測試()
         {
             //前置條件
             using (var context = new TestEntities())
             {
                 Assert.AreEqual(1, context.Tables.Count());
             }

             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //添加數據
                 using (var context = new TestEntities())
                 {
                     context.Tables.Add(new Table() { Id = Guid.NewGuid(), Name = "段光偉" });
                     context.SaveChanges();
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //臟讀測試
                         using (var context = new TestEntities())
                         {
                             Assert.AreEqual(2, context.Tables.Count());
                         }
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();
             }

             //前置條件
             using (var context = new TestEntities())
             {
                 Assert.AreEqual(1, context.Tables.Count());
             }
         }

不可重復讀

定義:A事務讀取了兩次數據,在這兩次的讀取過程中B事務修改了數據,A事務的這兩次讀取出來的數據不一樣了(不可重復讀)。

比喻:A在做源代碼審查,在審查的過程中獲取了兩次源代碼,在這兩次獲取期間B修改了源代碼,B修改的很可能是A審查過的代碼,而這部分代碼可能不符合規范了。

代碼示例

復制代碼 代碼如下:


[TestMethod]
         public void 不可重復讀_測試()
         {
             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //前置條件
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual("李妞妞", context.Tables.First().Name);
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //修改數據
                         using (var context = new TestEntities())
                         {
                             context.Tables.First().Name = "段光偉";
                             context.SaveChanges();
                         }

                         ts2.Complete();   
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

                 //不可重復讀測試
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual("段光偉", context.Tables.First().Name);
                 }
             }
         }


幻讀

定義:A事務讀取了兩次數據,在這兩次的讀取過程中B事務添加了數據,A事務的這兩次讀取出來的集合不一樣了(幻讀)。

比喻:A在統計文件數據,為了統計精確A統計了兩次,在這兩次的統計過程中B添加了一個文件,A發現這兩次統計的數量不一樣(幻讀),A會感覺自己的腦袋有點頭疼。

代碼示例

復制代碼 代碼如下:


[TestMethod]
         public void 幻讀_測試()
         {
             var autoResetEvent = new AutoResetEvent(false);

             var transactionOptions1 = new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead };
             var transactionOptions2 = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };

             using (var ts1 = new TransactionScope(TransactionScopeOption.Required, transactionOptions1))
             {
                 //前置條件
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual(1, context.Tables.Count());
                 }

                 ThreadPool.QueueUserWorkItem(data =>
                 {
                     using (var ts2 = new TransactionScope(TransactionScopeOption.Required, transactionOptions2))
                     {
                         //添加數據
                         using (var context = new TestEntities())
                         {
                             context.Tables.Add(new Table() { Id = Guid.NewGuid(), Name = "段光偉" });
                             context.SaveChanges();
                         }

                         ts2.Complete();
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

                 //幻讀測試
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual(2, context.Tables.Count());
                 }
             }
         }


四種隔離級別如何處理并發問題

 臟讀不可重復讀幻讀
讀未提交允許允許允許
讀已提交不允許允許允許
可重復讀不允許不允許允許
串行化不允許不允許不允許

看完上述內容,你們對.NET中怎么實現不可重復讀與幻讀有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹凤县| 类乌齐县| 即墨市| 胶州市| 恩施市| 东安县| 监利县| 龙泉市| 包头市| 双流县| 连州市| 图木舒克市| 巴彦淖尔市| 元朗区| 奉贤区| 信宜市| 盈江县| 大城县| 沂南县| 弥勒县| 从江县| 大埔区| 芒康县| 县级市| 平遥县| 江城| 伽师县| 哈巴河县| 隆德县| 兴仁县| 寻乌县| 抚松县| 和田市| 巩义市| 台东市| 仪陇县| 洛阳市| 桑日县| 中牟县| 伽师县| 射阳县|