濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > .NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例

.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例

熱門標(biāo)簽:地圖標(biāo)注位置多的錢 廈門四川外呼系統(tǒng) 內(nèi)蒙古智能電銷機(jī)器人哪家強(qiáng) 山東防封電銷卡辦理套餐 怎樣在地圖標(biāo)注消火栓圖形 杭州智能電話機(jī)器人 濟(jì)源人工智能電話機(jī)器人價(jià)格 百度地圖標(biāo)注點(diǎn)擊事件 泰州手機(jī)外呼系統(tǒng)軟件

并發(fā)可能產(chǎn)生的三種問(wèn)題

臟讀

定義:A事務(wù)執(zhí)行過(guò)程中B事務(wù)讀取了A事務(wù)的修改,但是A事務(wù)并沒(méi)有結(jié)束(提交),A事務(wù)后來(lái)可能成功也可能失敗。

比喻:A修改了源代碼并且并沒(méi)有提交到源代碼系統(tǒng),A直接通過(guò)QQ將代碼發(fā)給了B,A后來(lái)取消了修改。

代碼示例

復(fù)制代碼 代碼如下:

[TestMethod]
         public void 臟讀_測(cè)試()
         {
             //前置條件
             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))
             {
                 //添加數(shù)據(jù)
                 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))
                     {
                         //臟讀測(cè)試
                         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());
             }
         }

不可重復(fù)讀

定義:A事務(wù)讀取了兩次數(shù)據(jù),在這兩次的讀取過(guò)程中B事務(wù)修改了數(shù)據(jù),A事務(wù)的這兩次讀取出來(lái)的數(shù)據(jù)不一樣了(不可重復(fù)讀)。

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

代碼示例

復(fù)制代碼 代碼如下:

[TestMethod]
         public void 不可重復(fù)讀_測(cè)試()
         {
             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))
                     {
                         //修改數(shù)據(jù)
                         using (var context = new TestEntities())
                         {
                             context.Tables.First().Name = "段光偉";
                             context.SaveChanges();
                         }

                         ts2.Complete();   
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

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

幻讀

定義:A事務(wù)讀取了兩次數(shù)據(jù),在這兩次的讀取過(guò)程中B事務(wù)添加了數(shù)據(jù),A事務(wù)的這兩次讀取出來(lái)的集合不一樣了(幻讀)。

比喻:A在統(tǒng)計(jì)文件數(shù)據(jù),為了統(tǒng)計(jì)精確A統(tǒng)計(jì)了兩次,在這兩次的統(tǒng)計(jì)過(guò)程中B添加了一個(gè)文件,A發(fā)現(xiàn)這兩次統(tǒng)計(jì)的數(shù)量不一樣(幻讀),A會(huì)感覺(jué)自己的腦袋有點(diǎn)頭疼。

代碼示例

復(fù)制代碼 代碼如下:

[TestMethod]
         public void 幻讀_測(cè)試()
         {
             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))
                     {
                         //添加數(shù)據(jù)
                         using (var context = new TestEntities())
                         {
                             context.Tables.Add(new Table() { Id = Guid.NewGuid(), Name = "段光偉" });
                             context.SaveChanges();
                         }

                         ts2.Complete();
                     }

                     autoResetEvent.Set();
                 });

                 autoResetEvent.WaitOne();

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

四種隔離級(jí)別如何處理并發(fā)問(wèn)題
  臟讀 不可重復(fù)讀 幻讀
讀未提交 允許 允許 允許
讀已提交 不允許 允許 允許
可重復(fù)讀 不允許 不允許 允許
串行化 不允許 不允許 不允許

標(biāo)簽:周口 新鄉(xiāng) 洛陽(yáng) 百色 臺(tái)州 朝陽(yáng) 喀什 朔州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例》,本文關(guān)鍵詞  .NET,中,關(guān)于,臟讀,不可,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    沙田区| 闵行区| 保康县| 平邑县| 武安市| 丰顺县| 微山县| 措勤县| 石屏县| 巴楚县| 诸暨市| 舒城县| 拉萨市| 丰城市| 德化县| 体育| 东丰县| 平遥县| 梁河县| 澄迈县| 凤台县| 砀山县| 平山县| 四子王旗| 莒南县| 张家口市| 英吉沙县| 铜山县| 监利县| 东兰县| 合阳县| 年辖:市辖区| 福泉市| 嘉峪关市| 城市| 公安县| 屏东市| 潮州市| 视频| 保山市| 吐鲁番市|