このスクリプト設定に基づいてトランザクションがロールバックされた場合、スクリプトはカーソル内の次の項目をフェッチしますか?

なになになに

私はカーソルにあまり精通していませんが、比較的単純なことを1つ知っておく必要があります。以下のスクリプトの構造を見て、カーソルがインスタンス化される場所と、カーソルが閉じられる/割り当て解除される場所に注意してください。私が書いた場所でスクリプトがデッドロック/* most of the code here */し、トランザクションがロールバックされてから再試行された場合、スクリプトが試行するとどうなりfetch nextますか?実行がカーソルの閉じる/割り当て解除の行に到達することはなかったので、2回目の試行で、カーソルが2番目の行をフェッチするように感じます。これが正しく記述されているとは主張していないことに注意してください。私が抱えている問題は、トランザクションのコミット後にカーソルの割り当てが解除されたことが原因であるように感じます。

declare LPCursor cursor for 
/*
...
*/

while (@deadlockretries <= @Maxlockretries)
begin

  begin try
    begin transaction

      fetch next from LPCursor into @var1, @var2, @var3
      while (@@fetch_status = 0)
      begin

        /* most of the code here */

      end 

    commit transaction

    close LPCursor
    deallocate LPCursor

  end try

  begin catch

    if (error_number() = 1205)
    begin

      if xact_state() <> 0 
      begin

        rollback transaction

      end

    end

  end catch

end
JMabee

次のものをフェッチしますが、この方法で実行すると、途中でロールバックしたために見落とされる「処理」のブロックが発生することを知っていると思います。どちらの方法でも、コードを変更して、どのように前進するかを示します。

CREATE TABLE #tmp(VAL1 varchar(10), VAL2 varchar(10), VAL3 varchar(10))
INSERT INTO #tmp VALUES('val1_1','val1_2','val1_3')
INSERT INTO #tmp VALUES('val2_1','val2_2','val2_3')
INSERT INTO #tmp VALUES('val3_1','val3_2','val3_3')
INSERT INTO #tmp VALUES('val4_1','val4_2','val4_3')
INSERT INTO #tmp VALUES('val5_1','val5_2','val5_3')
INSERT INTO #tmp VALUES('val6_1','val6_2','val6_3')
INSERT INTO #tmp VALUES('val7_1','val7_2','val7_3')


DECLARE @deadlockretries int = 0
declare @Maxlockretries int = 3

declare @var1 varchar(10)
declare @var2 varchar(10)
declare @var3 varchar(10)

DECLARE LPCursor cursor for SELECT VAL1, val2, val3 from #tmp
open LPCursor
while (@deadlockretries <= @Maxlockretries)
begin
    PRINT 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

  begin try
    begin transaction

      fetch next from LPCursor into @var1, @var2, @var3
      -- print @var1 + @var2 + @var3
      while (@@fetch_status = 0)
      begin
      print @var1 + @var2 + @var3
        /* most of the code here */
        select 1/0
        fetch next from LPCursor into @var1, @var2, @var3
    end 

    commit transaction
    SET @deadlockretries = @Maxlockretries
    close LPCursor
    deallocate LPCursor

  end try

  begin catch
  PRINT 'ERROR'
  print error_number()
    if (error_number() = 8134)
    begin

      if xact_state() <> 0 
      begin
      PRINT 'ROLLBACK'
        rollback transaction
      end
    end
  end catch
  PRINT 'END'
  SET @deadlockretries += 1
end

IF CURSOR_STATUS('global','LPCursor')>=-1
BEGIN
 DEALLOCATE LPCursor
END

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ