4

さて、私は、最も重要な問題の1つがデータベースの一貫性である割り当て[ミニプロジェクト]を取得しました。このプロジェクトは、複数のユーザーがプロジェクトにアクセスして操作できるようにするWebアプリケーションです。小さなテーブルセットへのクエリと更新の同時実行が期待できます。それらの一部は相互に接続されています(外部キーを使用)。

データベースの一貫性を可能な限り維持するために、分離レベルを使用することをお勧めします。それらについて少し(多分十分ではない?)読んだ後、私にとって最も有用なものはREADCOMMITTEDとSERIALIZABLEであると思いました。

クエリは次の3種類に分けることができます。

  1. クエリの取得
  2. クエリの更新
  3. コンボ

1つ目は、もちろんデータの一貫性が必要です。ダーティデータやコミットされていないデータなどを表示したくないので、これらのクエリにはREADCOMMITTEDを使用することを考えました。クエリの更新については、SERIALIZABLEを使用するのが最善の選択肢だと思いましたが、少し読んだ後、迷子になりました。コンボでは、おそらくDBから読み取り、更新が必要かどうかを判断する必要があります。これらの2〜3回の呼び出しは同じトランザクションで行われます。

これらの各クエリオプションで使用する分離レベルについてアドバイスを求めたかった。タイプごとに異なる分離レベルを検討する必要がありますか?またはただ1つに固執しますか?

MySQL5.1.53とMySQLJDBC3.1.14ドライバーを使用しています(要件... JDBCバージョンを選択しませんでした)

あなたの洞察は大歓迎です!

編集:

デフォルトレベルのように見えるREPEATABLEREADを使用することにしました。それが正しい方法かどうかはわかりませんが、共有モードでのロックとクエリの更新のための繰り返し読み取りは正常に機能するはずです...

皆さんはどう思いますか?

4

2 に答える 2

-3

分離レベルを気にしすぎだと思います。

更新するテーブルが複数ある場合は、次のことを行う必要があります。

START TRANSACTION;
  UPDATE table1 ....;
  UPDATE table2 ....;
  UPDATE table3 ....;
COMMIT;  

これは重要なことです。分離レベルは単なる肉汁です。

反復可能な読み取りのデフォルト レベルで問題ありません。

はテーブルをロックすることに注意してselect ... for updateください。これにより、解決しようとしている問題よりも悪いデッドロックが発生する可能性があります。これは、DB の行を削除する場合に
のみ使用してください。

正直なところ、DB で行が削除されることはめったにありません。更新を行っているだけの場合は、通常の選択を使用してください。

とにかく参照してください:http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

于 2011-10-14T21:05:09.923 に答える