欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2013年04月16日 08:58:05   作者:  
本篇文章小編將為大家介紹,.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例,有需要的朋友可以參考一下

并發(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ù)讀 不允許 不允許 允許
串行化 不允許 不允許 不允許

相關(guān)文章

  • .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于.Net Core路由處理的知識(shí)點(diǎn)與方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • vs2010制作簡(jiǎn)單的asp.net網(wǎng)站

    vs2010制作簡(jiǎn)單的asp.net網(wǎng)站

    這篇文章主要介紹了vs2010制作簡(jiǎn)單的asp.net網(wǎng)站,只要十步哦,感興趣的小伙伴們可以參考一下
    2015-09-09
  • .NET AppSettings與ConnectionStrings使用案例詳解

    .NET AppSettings與ConnectionStrings使用案例詳解

    這篇文章主要介紹了.NET AppSettings與ConnectionStrings使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • .Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc(續(xù))

    .Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc(續(xù))

    怎樣直接獲取Ioc中的實(shí)例對(duì)象,而不是以構(gòu)造函數(shù)的方式進(jìn)行獲取呢?這篇文章繼續(xù)為大家介紹.Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc
    2018-03-03
  • asp.net c#采集需要登錄頁(yè)面的實(shí)現(xiàn)原理及代碼

    asp.net c#采集需要登錄頁(yè)面的實(shí)現(xiàn)原理及代碼

    當(dāng)我們采集頁(yè)面的時(shí)候,如果被采集的網(wǎng)站需要登錄才能采集,原理搞清楚了,就好辦了,我們所要做的僅僅是在采集的時(shí)候(或者說(shuō)HttpWebRequest提交數(shù)據(jù)的時(shí)候),將Cookie信息放入Http請(qǐng)求頭里面就可以了,感興趣的朋友可以了解下,或許對(duì)你有所幫助
    2013-02-02
  • asp.net獲取網(wǎng)站目錄物理路徑示例

    asp.net獲取網(wǎng)站目錄物理路徑示例

    這篇文章主要介紹了asp.net獲取網(wǎng)站目錄物理路徑的方法,需要的朋友可以參考下
    2014-02-02
  • Asp.Net Core 中的“虛擬目錄”實(shí)現(xiàn)

    Asp.Net Core 中的“虛擬目錄”實(shí)現(xiàn)

    這篇文章主要介紹了Asp.Net Core 中的“虛擬目錄”實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • .NET實(shí)現(xiàn)熱插拔功能(動(dòng)態(tài)替換功用)方案實(shí)例

    .NET實(shí)現(xiàn)熱插拔功能(動(dòng)態(tài)替換功用)方案實(shí)例

    如果某個(gè)"功能"需要?jiǎng)討B(tài)更新?這種動(dòng)態(tài)更新,可能是需求驅(qū)動(dòng)的,也可能是為了修改 BUG,面對(duì)這種場(chǎng)景,如何實(shí)現(xiàn)“熱插拔”呢?先解釋一下“熱插拔”:在系統(tǒng)運(yùn)行過(guò)程動(dòng)態(tài)替換某些功能,不用重啟系統(tǒng)進(jìn)程。下面看例子
    2013-11-11
  • URL中去除指定參數(shù)實(shí)現(xiàn)C#代碼

    URL中去除指定參數(shù)實(shí)現(xiàn)C#代碼

    URL中去除指定參數(shù)在項(xiàng)目開(kāi)發(fā)中還是很常見(jiàn)的,本文將介紹下它在c#代碼中的實(shí)現(xiàn),感興趣的朋友可以參考下哈
    2013-04-04
  • 詳解ASP.NET Core Token認(rèn)證

    詳解ASP.NET Core Token認(rèn)證

    這篇文章主要介紹了詳解ASP.NET Core Token認(rèn)證,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。
    2016-12-12

最新評(píng)論