qileilove

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

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

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

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

            1、READ UNCOMMITTED,會(huì)導(dǎo)致臟讀(能讀取其它事務(wù)沒有提交的更改)和不可重復(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修改了但沒有提交的數(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ù)讀的問題,在這幾個(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沒有提交前的數(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)論排行榜

          主站蜘蛛池模板: 图们市| 宣恩县| 呈贡县| 乐陵市| 新化县| 乌兰浩特市| 临沧市| 五原县| 苍梧县| 崇信县| 松溪县| 淮阳县| 汕头市| 沅陵县| 湖州市| 东至县| 平湖市| 滦平县| 黄大仙区| 东乡| 大渡口区| 苗栗县| 昌宁县| 沙湾县| 项城市| 黔南| 靖州| 栖霞市| 贺兰县| 儋州市| 宜兰市| 邹平县| 车致| 六安市| 玛曲县| 大名县| 牙克石市| 襄樊市| 滨州市| 宜丰县| 界首市|