どのように私は、非ブロッキングの環境では、このMySQLの/ InnoDBのデッドロックの問題を修正しますか?

StackOverflow https://stackoverflow.com/questions/870097

  •  22-08-2019
  •  | 
  •  

質問

私たちは、InnoDBエンジンストレージとMySQLを使っています。 私たちは、テーブルの上に複数の同時要求を送信し、「イベント化」環境を持っています。 基本的には、次のように動作します。 我々はそれを行うfind_or_insert機能を持っています: - 見つける() - >結果で、空の場合 - >挿入 - >結果に()

見つけます

私たちは、とても基本的に、非ブロックMySQLドライバを使用している私たちは複数回、同時によりこの小さなアルゴリズムを起動したとき、それは最初の結果...などを挿入する前に、すべての発見を実行します。

残念ながら、私たちは、これらのエラーを取得します: 「ロックを取得しようとすると、デッドロックが見つかりました。トランザクションを再起動してみてください」

誰もがそれを助けることができますか?

[EDIT]:また、私は実際にMySQLはちょうどここに新しい要素を挿入するために、テーブルをロックする必要がある理由を理解していません。自動インクリメントがここに犯人だったが当初、私は、私はそれを削除... BU私はまだエラーを取得します。インサート上でテーブルをロックするMySQLのを防止するための方法はありますか?

役に立ちましたか?

解決

診断するための MySQLのリファレンスマニュアルをお試しくださいそして、解決。あなたがキャッシュを作っているように聞こえます。考えられる理由は、クライアントの多くは、同時に「最初のバージョン」(すなわち「の場合は、空の挿入」をヒット)を作成しようとしているテーブルを打つことが考えられます。たぶん、あなたは、擬似ランダム遅延を追加したり、DBへの同時作成のコールの多くを取得しないようにクリエイターを調整することができるか。

EDIT:あなたはこののページを見たことがありますか?あなたはInnoDBの持つごとのテーブルのロックを無効にする設定のmy.cnfを設定する必要がありますように思えます。私は主にかかわらず、示唆されたもの、それは現実的な状況よりもはるかに高い割合の作家が含まれているかもしれないので、あなたのテストは表現できない場合がありますということでした。あなたは空のテーブルに100個のスレッドを起動した場合、それらはすべて、即座に(でも多分同じ値のため)を作成の上にブロックします。これは、キーの上に、より良い広がりを持っている平均的な状況、少ないミスや読みのはるかに高い割合に比べてはるかに悪いです。これは予期された動作(すなわち、あなたが生きてこの動作を持っているでしょう)である場合は、私が作成する文でバックオフ戦略を追加することを示唆しています。

他のヒント

あなたは、一度に1つが起こるので、多分非ブロックドライバーというの使用を停止するには、これらの要求を必要としています。または、独自のブロック機構を実装します。 1次のいずれかに移動する前に終了するのを待ちます。

あなたは、これは無理がある、またはあなたが何らかの理由でそうすぐに沿って移動するためにこれらの事を必要とするということを言ったhavent。

私は質問が改訂されていることを反映するために、私の答えを変更しています。これは、同時挿入の唯一の問題ではなく、検索行動への依存性であるように今は鳴ります。

これは、InnoDBは、行の挿入にロックしないと、あなたがこれをオフにすることはできませんというのが私の理解です。ただし、[編集] DELAYED INSERTを使用することができません。私は、これはInnoDBのでは利用できません読みます。

http://dev.mysql.com/doc /refman/5.0/en/insert-delayed.htmlする

おそらく、すべてのあなたの書き込みの周りの明示的なLOCK TABLESのは、総称して、デフォルトのロック動作をオーバーライドします。表には他の操作が書き込みイベントが発生したインターバルの間に存在しない場合、これはうまくいくかもしれない。

http://dev.mysql.com/doc /refman/5.0/en/lock-tables.htmlする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top