古之成大事者,不唯有超世之才,亦唯有堅韌不拔之志也!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 44 文章 :: 1 評論 :: 0 Trackbacks

          自己總結經(jīng)驗:
          1: 不管是sqlerver 還是 oracle ,insert加的都是行鎖.就是說只要并行的數(shù)據(jù)不違反數(shù)據(jù)庫的約束條 件, A不提交是不會阻塞 B提交的. 但如果違反了約束比如主鍵約束 .A 沒有提交會阻塞B的提交.

          2: select * from table 加的是共享鎖,共享鎖是在得到結果后就馬上釋放的,不管是直接使用sql還是 在存儲過程事務中,除非你加上 select * from table holdlock 這樣的話要 commit tran才釋放
          S鎖.

          3: 這種情況也會死鎖 (但容易讓人忽略)
          begin transaction
          insert into test values.....
          select * from test
          commit tran
          A 獲得一個IX鎖 成功執(zhí)行 insert .
          B 獲得一個IX鎖 成功執(zhí)行 insert .
          A 向數(shù)據(jù)庫申請一個S 鎖,但是由于這時候表test已經(jīng)存在一個IX鎖并且屬于另外一個連接因 此他只好在此等候
          B 向數(shù)據(jù)庫申請一個S 鎖,但是由于這時候表test已經(jīng)存在一個IX鎖并且屬于另外一個連接因 此他只好在此等候
          死鎖發(fā)生.


          4: 最好是保證資源的順序訪問,就是說A 先操作table1 再操作 table2 .那么B也要先操作table1 再操 作 table2.可以放置阻塞和死鎖.

          5: update 加的是排他鎖.提交之前..select * from table 共享鎖也要等待.

          6: 存儲過程中的語句默認不會是一個事務 除非你加上 begin transaction  commit  tran 

          鎖信息

          共享 (S) 用于不更改或不更新數(shù)據(jù)的操作(只讀操作),如 SELECT 語句。
          更新 (U) 用于可更新的資源中。防止當多個會話在讀取、鎖定以及隨后可能進行的資源更新時發(fā)生常 見形式的死鎖。
          排它 (X) 用于數(shù)據(jù)修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時對同一資源 進行多重更新。
          意向 用于建立鎖的層次結構。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共 享 (SIX)。
          架構 在執(zhí)行依賴于表架構的操作時使用。架構鎖的類型為:架構修改 (Sch-M) 和架構穩(wěn)定性 (Sch -S)。
          大容量更新 (BU) 向表中大容量復制數(shù)據(jù)并指定了 TABLOCK 提示時使用。

          共享鎖
          共享 (S) 鎖允許并發(fā)事務讀取 (SELECT) 一個資源。資源上存在共享 (S) 鎖時,任何其它事務都不能修改數(shù)據(jù)。一旦已經(jīng)讀取數(shù)據(jù),便立即釋放資源上的共享 (S) 鎖,除非將事務隔離級別設置為可重復讀或更高級別,或者在事務生存周期內(nèi)用鎖定提示保留共享 (S) 鎖。

          更新鎖
          更新 (U) 鎖可以防止通常形式的死鎖。一般更新模式由一個事務組成,此事務讀取記錄,獲取資源(頁或行)的共享 (S) 鎖,然后修改行,此操作要求鎖轉換為排它 (X) 鎖。如果兩個事務獲得了資源上的共享模式鎖,然后試圖同時更新數(shù)據(jù),則一個事務嘗試將鎖轉換為排它 (X) 鎖。共享模式到排它鎖的轉換必須等待一段時間,因為一個事務的排它鎖與其它事務的共享模式鎖不兼容;發(fā)生鎖等待。第二個事務試圖獲取排它 (X) 鎖以進行更新。由于兩個事務都要轉換為排它 (X) 鎖,并且每個事務都等待另一個事務釋放共享模式鎖,因此發(fā)生死鎖。

          若要避免這種潛在的死鎖問題,請使用更新 (U) 鎖。一次只有一個事務可以獲得資源的更新 (U) 鎖。如果事務修改資源,則更新 (U) 鎖轉換為排它 (X) 鎖。否則,鎖轉換為共享鎖。

          排它鎖
          排它 (X) 鎖可以防止并發(fā)事務對資源進行訪問。其它事務不能讀取或修改排它 (X) 鎖鎖定的數(shù)據(jù)。

          意向鎖
          意向鎖表示 SQL Server 需要在層次結構中的某些底層資源上獲取共享 (S) 鎖或排它 (X) 鎖。例如,放置在表級的共享意向鎖表示事務打算在表中的頁或行上放置共享 (S) 鎖。在表級設置意向鎖可防止另一個事務隨后在包含那一頁的表上獲取排它 (X) 鎖。意向鎖可以提高性能,因為 SQL Server 僅在表級檢查意向鎖來確定事務是否可以

          安全地獲取該表上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。

          意向鎖包括意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

          鎖模式 描述
          意向共享 (IS) 通過在各資源上放置 S 鎖,表明事務的意向是讀取層次結構中的部分(而不是全部)底層資源。
          意向排它 (IX) 通過在各資源上放置 X 鎖,表明事務的意向是修改層次結構中的部分(而不是全部)底層資源。IX 是 IS 的超集。
          與意向排它共享 (SIX) 通過在各資源上放置 IX 鎖,表明事務的意向是讀取層次結構中的全部底層資源并修改部分(而不是全部)底層資源。允許頂層資源上的并發(fā) IS 鎖。例如,表的 SIX 鎖在表上放置一個 SIX 鎖(允許并發(fā) IS 鎖),在當前所修改頁上放置 IX 鎖(在已修改行上放置 X 鎖)。雖然每個資源在一段時間內(nèi)只能有一個 SIX 鎖,以防止其它事務對資源進行更新,但是其它事務可以通過獲取表級的 IS 鎖來讀取層次結構中的底層資源。


          架構鎖
          執(zhí)行表的數(shù)據(jù)定義語言 (DDL) 操作(例如添加列或除去表)時使用架構修改 (Sch-M) 鎖。

          當編譯查詢時,使用架構穩(wěn)定性 (Sch-S) 鎖。架構穩(wěn)定性 (Sch-S) 鎖不阻塞任何事務鎖,包括排它 (X) 鎖。因此在編譯查詢時,其它事務(包括在表上有排它 (X) 鎖的事務)都能繼續(xù)運行。但不能在表上執(zhí)行 DDL 操作。

          大容量更新鎖
          當將數(shù)據(jù)大容量復制到表,且指定了 TABLOCK 提示或 者使用 sp_tableoption 設置了 table lock on bulk 表選項時,將使用大容量更新 (BU) 鎖。大容量更新 (BU) 鎖允許進程將數(shù)據(jù)并發(fā)地大容量復制到同一表,同時防止其它不進行大容量復制數(shù)據(jù)的進程訪問該表。

          posted on 2008-05-16 10:31 goto 閱讀(265) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
          主站蜘蛛池模板: 淮南市| 富川| 沂源县| 谢通门县| 乌什县| 阿坝| 丘北县| 萨嘎县| 瑞安市| 大冶市| 子洲县| 当雄县| 邯郸市| 石棉县| 泽普县| 怀安县| 乌拉特前旗| 措美县| 高淳县| 桑植县| 紫金县| 太保市| 福贡县| 桐城市| 景洪市| 济宁市| 四子王旗| 兴海县| 电白县| 阿坝| 九龙县| 宽甸| 社旗县| 连城县| 嘉祥县| 通许县| 南宫市| 黔东| 石台县| 福建省| 隆回县|