2011-08-22 8 views
5

DB(innodb engine)としてMySQLを使用したトランザクション性の高いシステムを作成しています。テーブルt2とt3を更新しているテーブルt1に、挿入トリガと更新トリガが1つあります。同時ユーザーのボリュームが高い場合は常に、テーブルt1のデッドロックが発生していることがわかりました。トリガーが実行を完了するまで、テーブルロックを発行していると仮定しています。私たちはt1にトリガーを落としましたが、意外にもデッドロックはありません。トランザクションシステムでのトリガー

私の質問:

  1. はそれがないと同じロジックを実装するために私たちの他のオプションが何であるかをトリガしていない場合は、高トランザクションシステム
  2. にトリガを持っていることをお勧めします。

表t1は、約70,000行を持ち、日々増加しています。

任意の入力を理解してください。

ありがとうございます。

+4

あなたは十分な情報を提供していません。 SHOW ENGINE INNODB STATUSを発行すると、デッドロックの原因が表示されます。 70k行は実際には何もないので、何をすべきか(助けが必要な場合)は質問、テーブル構造、トリガを投稿します。ビジネスロジックが明らかにならないように、実際のフィールド名を文字に置き換えることができます。 –

答えて

0

代わりにトランザクションを使用して、すべてのクライアント側を処理できます。

START TRANSACTION; 

insert into t1; 
update t2; 
update t3; 

COMMIT; 

クライアントが提供するデータを使用して逃げることができない場合は、 'update select'と 'insert select'構造を使用しないでください。 また、InnoDBはMyISAMが使用するテーブルロックよりも優れた行ロックを使用します。