今天就跟大家聊聊有關(guān).NET中怎么實(shí)現(xiàn)不可重復(fù)讀與幻讀,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有湛江免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。并發(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 臟讀_測(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ù),在這兩次的讀取過程中B事務(wù)修改了數(shù)據(jù),A事務(wù)的這兩次讀取出來的數(shù)據(jù)不一樣了(不可重復(fù)讀)。
比喻:A在做源代碼審查,在審查的過程中獲取了兩次源代碼,在這兩次獲取期間B修改了源代碼,B修改的很可能是A審查過的代碼,而這部分代碼可能不符合規(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ù),在這兩次的讀取過程中B事務(wù)添加了數(shù)據(jù),A事務(wù)的這兩次讀取出來的集合不一樣了(幻讀)。
比喻:A在統(tǒng)計(jì)文件數(shù)據(jù),為了統(tǒng)計(jì)精確A統(tǒng)計(jì)了兩次,在這兩次的統(tǒng)計(jì)過程中B添加了一個(gè)文件,A發(fā)現(xiàn)這兩次統(tǒng)計(jì)的數(shù)量不一樣(幻讀),A會(huì)感覺自己的腦袋有點(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ā)問題
臟讀 | 不可重復(fù)讀 | 幻讀 | |
讀未提交 | 允許 | 允許 | 允許 |
讀已提交 | 不允許 | 允許 | 允許 |
可重復(fù)讀 | 不允許 | 不允許 | 允許 |
串行化 | 不允許 | 不允許 | 不允許 |
看完上述內(nèi)容,你們對(duì).NET中怎么實(shí)現(xiàn)不可重復(fù)讀與幻讀有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文標(biāo)題:.NET中怎么實(shí)現(xiàn)不可重復(fù)讀與幻讀-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://www.rwnh.cn/article42/esiec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站營(yíng)銷、電子商務(wù)、服務(wù)器托管、網(wǎng)站收錄、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容