1

次のステートメントに問題があります。誰かわかりませんか??

どんなコメントでも大歓迎です!!

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
                     FROM tableTxInfo 
                     WHERE tableTxInfo.messageId = 'john-to-bob' 
                     and tableTx.ResultCode != 1)

idtableTxtableTxInfoは同じです ( として使用されますINTEGER PRIMARY KEY) 新しいトランザクションの場合、 と の両方に対してtableTx同じtableTxInfoID を持つ新しいレコードが作成されます。

で約40000件のレコードがありmessageId = "john-to-bob"ます。

2 つの異なるスレッドから上記の SQL ステートメントを実行しようとすると、1 つのスレッドが長時間ハングし、もう 1 つのスレッドが応答を受け取るだけです。

トランザクションがデッドロックを検出しました。トランザクションはロールバックされました。

私は SQL とデータベースの概念にあまり詳しくありません。この種のエラーを防ぐ方法はありますか?

私のデータベースは IBM soliddb です

4

1 に答える 1

2

次のように試すことができます。

UPDATE tableTx 
SET tableTx.ResultCode = 0 
WHERE tableTx.id in (SELECT tableTxInfo.id 
                     FROM tableTxInfo 
                     WHERE tableTxInfo.messageId = 'john-to-bob') 
      AND tableTx.ResultCode != 1;

これにより、2 つのクエリ間の循環的な依存関係が回避される場合があります。

幸運を!

于 2013-02-23T09:26:21.890 に答える