0

プロセスによって時々更新されるデータベーステーブルがあります。ただし、場合によっては、特定の行にオーバーライドを適用したいことがあります。オーバーライドなどを処理するために多くのコードを書かずに、データベース自体の行またはフィールドをロックする方法はありますか?

たとえば、私のテーブルは次のようになります

STUDENT | TEST_SCORE_AVG | HOMEWORK_AVG
John    |       92.3     |     88.8
Lisa    |       77.4     |     99.8 
Terry   |       88.0     |     64.5

新しいテストや宿題が出るたびに、学生の平均値は変化します。しかし、その先生がジョンの母親で、何があっても宿題の平均点が 100.0 だとします。値を変更しようとするプログラムが跳ね返るように、それをロックする方法はありますか? MySQL ワークベンチを使用して MySQL データベース (InnoDB) にアクセスしています

アップデート:

行全体をロックする関数を使用することもできます。つまり、変更も変更TEST_SCORE_AVGHOMEWORK_AVGできません。接続が失われたかどうかに関係なく、ソリューションが長期間持続する必要があります。ロックを解除するまで行をロックしたい

4

2 に答える 2

0

いいえ、1 つの行の 1 つの値が変更されないようにする実際的な方法はありません。

MySQL 以外のほぼすべてのものを使用して、John の宿題の平均が常に 100 であることを保証する CHECK() 制約を作成できますが、それは実用的とは言えません。MySQL では、トリガーを使用して同じ機能を取得する必要がありますが、これも実用的とは言えません。

他の回答は、行レベルのロックに関するものです。これは、単一の行の単一の値が変更されないようにすることとはまったく関係ありません。

于 2012-12-04T20:53:26.653 に答える
0

マニュアルから:

InnoDB は、次の 2 種類のロックがある標準の行レベル ロックを実装します。

  • 共有 (S) ロックにより、トランザクションは行を読み取ることができます。
  • 排他 (X) ロックにより、トランザクションは行を更新または削除できます。

特定の行をロックできますが、特定の行列をロックすることはできません。

于 2012-12-04T20:47:44.263 に答える