1

次のシナリオでトランザクション/ロックが本当に必要かどうか疑問に思っています。任意の数で同時に実行できる 3 つの操作を実行できます (つまり、2 つのタスク 1 を実行し、3 つのタスク 2 を実行できます)。

タスク1:

select distinct count(some_id) as my_counter from table_1;
update table_2 set counter = my_counter;

タスク 2:

insert into table_1 ...;
update table_2 set counter = counter + 1;

タスク 3:

delete from table_1 where id = ...;
update table_2 set counter = counter - 1;

table_2 のフィールドを決して破損しないことを確認するには、上記をどのように実装すればよいcounterですか?

どうもありがとうございました!

4

2 に答える 2

1

いくつかのポイント:

  • いずれにしても、各タスクの 2 つのステートメントをトランザクションで囲む必要があります。
  • シリアライズ可能なトランザクション分離レベルが必要だと思います。それ以下ではダメです。たとえば、「反復可能な読み取り」タスク 1 を使用すると、table_2.counter が古い値に設定される場合があります。
  • table_2 の前に常に table_1 にアクセスする必要があります。これにより、デッドロックを防ぐ一貫したロック順序が保証されます。
于 2012-03-17T13:15:03.463 に答える
-1

TRIGGERタスク 2、3 に使用できます。適切な方法でテーブルをロックします。トランザクションの行ロックにTask 1使用する必要があるためXLOCK

于 2012-03-17T12:45:28.993 に答える