0

1 回のトランザクションで 1 ~ 3 個のテーブルを更新する 35 個の関数があります。ただし、更新を実行するだけでなく、クエリも実行します。

  • 表 1 は、行更新のみのアクションといくつかの照会を行います。
  • 表 2 は、既存の行に対してクエリと行レベルの更新を行い、場合によっては行を削除および追加します。表 2 には、行の削除、挿入、または更新の前後に、トランザクション内にクエリがある場合があります。
  • 表 3 は、上記の表 2 のアクションの結果に基づいて行の更新を行います。

私の最初のアクションは、最後にテーブル 3 の更新がすべて完了していることを確認することです。

表 1 は他の 2 つの表から独立しており、おそらく最初または最後になる可能性があります。したがって、表 2 は表 3 が変更される前に来る必要があります。

私の最初の懸念は、表 2 のアクションでは、クエリを実行してから更新を行い、さらにクエリを実行し、さらに更新を実行する場合があることです。これを行わないようにコードを再編成する必要がありますか。

私の 2 番目の懸念は、テーブル 3 が、サーブレット スレッドで高速でなければならないテーブルであるということです。表 3 は、単独で単純に照会するために使用されます。しかし、行レベルのロックがこれらのクエリを停止するようです。

必要に応じて、上記のテーブル セット メンテナンス コードを、1 つのスレッドから 1 つのクラスター全体のプロセスに入れることができます。更新速度は問題ありません。ただ、テーブル 3 に対するクエリは高速です。そして、デッドロックが発生することはありません。

Oracle と Innodb の違いがわからないので、そこで質問があります。(後で Oracle にアップグレードする予定です。)

基本的に、私は何に注意すべきかについての指針を探しています。もちろん、各 updater 関数の開始時にテーブル 2 とテーブル 3 の完全なテーブル ロックを強制することもできますが、そうすると Table3 サーブレット クエリ スレッドが影響を受けます。だから、それは解決策のようには見えません。

また、テーブル 2 自体に関連して、一部の関数がクエリを実行し、クエリに基づいて更新し、更新に基づいて新しいクエリを実行し、結果をテーブル 3 に更新するなど、さらに多くの更新を行うことを心配しています。本当に厄介です。

おすすめは?アンディ

2 つのテーブルの同じ行が同時に更新される可能性があるため、テーブルを同じ順序で更新するように注意しました。テーブルの 1 つに 2 つのインデックスがあり、インデックスを更新するにはテーブル ロックが必要なようです。一部の関数は、繰り返しループで、テーブル 1 をクエリし、テーブル 1 を更新し、オプションでテーブル 2 をクエリし、テーブル 2 を更新します。このテーブルは、すべてのコンテンツのツリーにすべての親子関係を保持するため、すべてのユーザーにわたって大量の更新が行われます。

4

1 に答える 1

2

まず、Oracle (および InnoDB だと思います) のクエリは、FOR UPDATE を使用しない限りロックを取得しません。

第二に、アプリケーションの規模がわかりません。予想される同時トランザクション数は? それらが同じ行を更新していると思いますか?

デッドロックが発生する可能性がある種類のアプリケーションは、予約または発券システム (劇場で同じ座席を予約しようとする人々など) であり、特に並行性の高い状況 (新しいショーが予約可能になる) で使用されます。

アプリケーションがこのプロファイルに適合する場合、おそらくデッドロック状態を予測する必要があります。ただし、少なくともエラーをトラップし、ロールバックしてからトランザクションを再試行することを検討します。テーブル構造、関係、および更新基準をさらに詳しく調べると、ロックの適切なポイントが明らかになる場合があります。

于 2010-08-04T06:28:16.810 に答える