熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

深入講解游標類型為什麼會產生數據檢索[2]

2013-11-13 12:35:16  來源: SQL語言 

  在定義此類游標的情況下 S鎖是必須下的 NOLOCK提示並不會起作用此現象通過查詢游標OPEN時的sp_lock信息就可以觀察得到它產生了IS和S鎖

  而NOLOCK 提示是否起作用 會影響的執行的結果(執行計劃一樣 但在取數據的時候 卻會有所差異)

  對於下面這句 有NOLOCK 和無NOLOCK 時 它取的數據是不一樣的 因為它只取了TOP 而且沒有ORDER BY 來保證取數的順序 所以取數據順序的細致差異 就導致了最終結果的不同 而最終結果的不同 導致了整個游標取出來的數據不同

  SELECT TOP()
  KeyID
  FROM tbmaster WITH(NOLOCK)
  WHERE Date >= //
  AND Date < //)

  在游標定義SELECT 語句中 當NOLOCK 有效時 是可以取到數據的 但NOLOCK 無效(DYNAMIC 游標導致)時 查詢結果是無數據的

  所以最終看到的結果是: 游標循環不出來數據 但只做查詢卻有數據

  如果把游標定義中的查詢語句的NOLOCK 去掉做查詢 也會沒有數據(與DYNAMIC 游標結果一致)

  故這個問題嚴格來說不應該是兼容級別的問題 級別下 還是有可能發生 只是機率更小 或者是內部執行原理不太一樣 導致沒有這種情況出來而已

  由於沒有ORDER BY來保證順序 而有無NOLOCK的數據可能不會一樣 所以下都可能出現問題 只是會顯得比較突出 或者僅僅時正好被發現了

  解決方法如下:

  首先需要把游標定義改成下面的這樣不會導致NOLOCK 失效 而且速度比原來的定義方式快得多 如果游標一定要與原始表的數據變化關聯起來 建議用KEYSET 或者是去掉NOLOCK 提示(因為沒有意義) 假如對取的數據有要求 我們還應當考慮加ORDER BY來保證取數順序

  DECLARE MyCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
  FOR

[]  []  


From:http://tw.wingwit.com/Article/program/SQL/201311/16194.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.