qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          實(shí)例演示SQL Server中五個(gè)事務(wù)隔離的區(qū)別

            網(wǎng)上里有很不錯(cuò)的介紹SQL Server事務(wù)隔離的文章,感覺很多都從概念入手介紹的,對(duì)那些初學(xué)者來(lái)說(shuō),看得見摸得著的理解才深刻,故不再重復(fù),重點(diǎn)在于實(shí)例演示上面。

            首先解釋下事務(wù)隔離是干什么的,一個(gè)事務(wù)的隔離級(jí)別控制了它怎么樣影響其它事務(wù)和被其它事務(wù)所影響。

            1、READ UNCOMMITTED,會(huì)導(dǎo)致臟讀(能讀取其它事務(wù)沒(méi)有提交的更改)和不可重復(fù)讀(事務(wù)讀取的數(shù)據(jù)被其它事務(wù)所修改,再次讀取時(shí)不一致)

            初始化:

          CREATE TABLE TranLevel (k int IDENTITY(1,1), val int)

          INSERT INTO TranLevel(val) values(1)

          INSERT INTO TranLevel(val) values(2)

          INSERT INTO TranLevel(val) values(3)

            首先執(zhí)行Query1,再新建查詢立即執(zhí)行Query2

            Query1:

          BEGIN TRAN Query1

          -- 在事務(wù)中修改

          UPDATE TranLevel SET val = 9

          --  '等待10秒,期間事務(wù)2運(yùn)行'

          WAITFOR DELAY '00:00:10'

          -- 不提交修改,回滾事務(wù)

          ROLLBACK TRAN Query1

            Query2:

          -- 設(shè)置當(dāng)前會(huì)話事務(wù)隔離級(jí)別為未提交讀

          SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

          BEGIN TRAN Query2

          SELECT '事務(wù)2開始并發(fā)執(zhí)行,讀取到了事務(wù)1修改了但沒(méi)有提交的數(shù)據(jù),是臟讀'

          SELECT * FROM Tranlevel

          SELECT '事務(wù)2等待10秒,讓事務(wù)1執(zhí)行完'

          WAITFOR DELAY '00:00:10'

          SELECT '兩次讀取的結(jié)果不一致,是不可重復(fù)讀'

          SELECT * FROM TranLevel

          COMMIT TRAN Query2

            下面就看看Query2執(zhí)行的結(jié)果是怎樣的:

            結(jié)果顯而易見,如果將事務(wù)隔離級(jí)別設(shè)置為未提交讀,則會(huì)造成臟讀和不可重復(fù)讀的問(wèn)題,在這幾個(gè)事務(wù)隔離級(jí)別中是限制最小的一個(gè),SQL Server分配的資源也最小。

           2、READ COMMITTED,提交讀,默認(rèn)的事務(wù)隔離級(jí)別,會(huì)造成不可重復(fù)讀。

            初始化:

          drop Table tranlevel

          CREATE TABLE TranLevel (k int IDENTITY(1,1), val int)

          INSERT INTO TranLevel(val) values(1)

          INSERT INTO TranLevel(val) values(2)

          INSERT INTO TranLevel(val) values(3)

            Query3:

          SET TRANSACTION ISOLATION LEVEL READ COMMITTED

          BEGIN TRAN Query3

          -- 等待10秒,再修改數(shù)據(jù)

          WAITFOR DELAY '00:00:10'

          UPDATE TranLevel SET val = 10

          COMMIT TRAN Query3

            Query 4:

          SET TRANSACTION ISOLATION LEVEL READ COMMITTED

          BEGIN TRAN Query4

          SELECT '查到的是Query3沒(méi)有提交前的數(shù)據(jù)'

          SELECT * FROM TranLevel

          SELECT '讓Query3執(zhí)行完'

          WAITFOR DELAY '00:00:10'

          SELECT '再次查詢,數(shù)據(jù)就變成Query3執(zhí)行完后的數(shù)據(jù)了'

          SELECT * FROM TranLevel

          COMMIT TRAN Query4

            執(zhí)行Query3后,新建查詢執(zhí)行Query4。下面看看Querry4查詢得到的數(shù)據(jù)。

            結(jié)果就是Query4中的事務(wù)查詢獲得了在Query3提交后的數(shù)據(jù),在同一事務(wù)中讀取的數(shù)據(jù)不一致,造成了不可重復(fù)讀。

          posted on 2013-05-24 10:27 順其自然EVO 閱讀(211) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 石阡县| 微博| 密山市| 祁东县| 图们市| 河曲县| 兴义市| 偏关县| 九江县| 开阳县| 山西省| 新宁县| 陆川县| 耿马| 尼勒克县| 大石桥市| 上虞市| 衡阳县| 嵊泗县| 龙江县| 晋城| 务川| 彝良县| 鄂温| 武清区| 庄浪县| 临沂市| 龙游县| 湟中县| 景德镇市| 萝北县| 白朗县| 济宁市| 朝阳区| 兴国县| 同德县| 大连市| 阳西县| 乃东县| 瓦房店市| 鄂托克前旗|