他のテーブルで発生した変更を記録するデータベース テーブルがあります。私のログテーブルのテーブル構造は次のとおりです。
Log_Table(id, table_name, operation, flag)
values (1, Customer_Table, 1, 1);
values (2, Customer_Table, 2, 1);
values (3, Customer_Table, 1, 1);
values (4, Customer_Table, 2, 1);
values (5, Customer_Table, 1, 1);
次の操作を実行して、Web ページのボタンに対してこのテーブルを更新します。
/* first */
public List<Long> select_Changes()
{
select id from Log_Table where flag =1;
}
/* (wait for user input) */
/* second */
public void update_table(List<Long> ids)
{
update Log_Table set flag =0 where id in( ids)
}
問題は、最初の操作と 2 番目の操作の間でユーザーが操作を実行することです。その間、別のユーザーが同時に同じ操作を行います。最初のユーザーによって既に選択されている行が 2 番目のユーザーによって選択されることは望ましくありません。つまり、2 番目のユーザーが最初のステップを実行すると (最初のユーザーが実行してからさらに 2 つの行が追加されたと仮定)、結果は次のようになります。
values(6,Customer,2,1);
values(7,Customer,1,1);
私が何をすべきか提案してください。行が選択された後、あらゆる種類の操作のために行をロックする必要があります。select for update 句を試しましたが、問題は解決しませんでした。それはWebアプリケーションにあります。