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

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

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

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

臟讀

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

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

代碼示例

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

[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))
             {
                 //添加數(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))
                     {
                         //臟讀測試
                         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ù),在這兩次的讀取過程中B事務(wù)修改了數(shù)據(jù),A事務(wù)的這兩次讀取出來的數(shù)據(jù)不一樣了(不可重復(fù)讀)。

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

代碼示例

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

[TestMethod]
         public void 不可重復(fù)讀_測試()
         {
             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ù)讀測試
                 using (var context = new TestEntities())
                 {
                     Assert.AreEqual("段光偉", context.Tables.First().Name);
                 }
             }
         }

幻讀

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

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

代碼示例

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

[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))
                     {
                         //添加數(shù)據(jù)
                         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());
                 }
             }
         }

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

相關(guān)文章

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

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

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

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

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

    .NET AppSettings與ConnectionStrings使用案例詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

    詳解ASP.NET Core Token認證

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

最新評論