2016-06-24 4 views
0

私はbegin endブロックを持つストアドプロシージャを持っています。たとえば、そのブロックにはselect文とupdate文がほとんどありません。sqlsはsybaseのbegin endブロック内で処理されます。

この開始ブロックの内側には、書き込まれた方法に従って一緒にまたは順次実行されるすべてのsqlsがありますか?

begin 
     select stmt 
     update stmt 
     select stmt 
     . 
     . 
    end 
+0

ステートメントが順番に並行して実行されていることを尋ねていますか、それとも何が問題なのですか? :) – Brimstedt

+0

はい。私は、すべてのsqlsが定義されている順番に1つずつ実行されるか、begin endブロックのすべてのsqlsがparallel.basicのアイデアであるかどうかを知りたいのですが、私はデッドロックを持っています。 begin end block – doubting

+0

デッドロックは、1つのスレッドによって1つのプロシージャで実行される重大なステートメントのためにはしないでください。しかし、プロシージャが多数のスレッドによって同時に実行されると、デッドロックする可能性があります。 – Brimstedt

答えて

1

ストアドプロシージャ内のステートメントは順番に実行されます。

序文がわからず、並行して実行できる唯一の事柄は、各ステートメントの内部で異なるサブステップです。選択は常に更新前に実行されますが、「テーブル」が「その他」の最初の、そしてと結合されている場合、SELECT文で、あなたが知らない

SELECT a, b 
    FROM table t 
    INNER JOIN other o 
     ON o.id = t.id 
    INNER JOIN third d 
     ON d.o_id = o.o_id 
    WHERE t.b = 123 

    UPDATE t 
    SET x = 123 
    FROM table t 
    WHERE t.b = 234 

:で例えば

、 'third'と結合されている場合、または 'other'が 'third'と結合されてから 'table'と結合されている場合

0

beginのすべてのステートメント - 終了ブロックが順番に実行されます。 プロシージャが複数のスレッドで実行されている必要があるため、デッドロックとその可能性の問題が発生しました。

これをシングルスレッドまたは2-3スレッドで実行でき、トランザクションが小さい場合、プロセスはデッドロックにエスカレートする前に待機することができます。デッドロックエラーの場合は、デッドロックのエラー番号をtry catchブロックに追加して、アップデートを再試行してください。

関連する問題