qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          實例演示SQL Server中五個事務隔離的區別

            網上里有很不錯的介紹SQL Server事務隔離的文章,感覺很多都從概念入手介紹的,對那些初學者來說,看得見摸得著的理解才深刻,故不再重復,重點在于實例演示上面。

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

            1、READ UNCOMMITTED,會導致臟讀(能讀取其它事務沒有提交的更改)和不可重復讀(事務讀取的數據被其它事務所修改,再次讀取時不一致)

            初始化:

          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)

            首先執行Query1,再新建查詢立即執行Query2

            Query1:

          BEGIN TRAN Query1

          -- 在事務中修改

          UPDATE TranLevel SET val = 9

          --  '等待10秒,期間事務2運行'

          WAITFOR DELAY '00:00:10'

          -- 不提交修改,回滾事務

          ROLLBACK TRAN Query1

            Query2:

          -- 設置當前會話事務隔離級別為未提交讀

          SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

          BEGIN TRAN Query2

          SELECT '事務2開始并發執行,讀取到了事務1修改了但沒有提交的數據,是臟讀'

          SELECT * FROM Tranlevel

          SELECT '事務2等待10秒,讓事務1執行完'

          WAITFOR DELAY '00:00:10'

          SELECT '兩次讀取的結果不一致,是不可重復讀'

          SELECT * FROM TranLevel

          COMMIT TRAN Query2

            下面就看看Query2執行的結果是怎樣的:

            結果顯而易見,如果將事務隔離級別設置為未提交讀,則會造成臟讀和不可重復讀的問題,在這幾個事務隔離級別中是限制最小的一個,SQL Server分配的資源也最小。

           2、READ COMMITTED,提交讀,默認的事務隔離級別,會造成不可重復讀。

            初始化:

          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秒,再修改數據

          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沒有提交前的數據'

          SELECT * FROM TranLevel

          SELECT '讓Query3執行完'

          WAITFOR DELAY '00:00:10'

          SELECT '再次查詢,數據就變成Query3執行完后的數據了'

          SELECT * FROM TranLevel

          COMMIT TRAN Query4

            執行Query3后,新建查詢執行Query4。下面看看Querry4查詢得到的數據。

            結果就是Query4中的事務查詢獲得了在Query3提交后的數據,在同一事務中讀取的數據不一致,造成了不可重復讀。

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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西充县| 唐山市| 满城县| 乌兰察布市| 吉安市| 高碑店市| 蒙山县| 南安市| 丽水市| 青川县| 教育| 镇赉县| 长岛县| 南阳市| 西和县| 揭西县| 云龙县| 青海省| 岑巩县| 祁连县| 仁化县| 无棣县| 宁远县| 松江区| 鄂托克旗| 中西区| 黔江区| 奉贤区| 南溪县| 湖口县| 寿阳县| 仁布县| 正阳县| 屯门区| 南溪县| 安西县| 浮山县| 将乐县| 渝中区| 秀山| 乌拉特后旗|