エンティティ User を作成しましたが、整数属性のトランザクション クォータがあります。その値に応じてトランザクション クォータを更新する必要があります。
0 より大きい場合はデクリメントする必要があり、それ以外の場合は値を保持する必要があります。
これが私のアルゴリズムです。
- データベースからユーザー エンティティを取得します。
- トランザクション クォータを確認し、トランザクション クォータが 0 より大きい場合は、1 減らします。
- 変更されたユーザー エンティティを保持します。
上記の場合、2 つのスレッドが同じユーザー エンティティを取得し、両方のスレッドが同じトランザクション クォータ値を読み取り、それが 0 より大きい場合、両方が 1 減らされ、ユーザー エンティティを更新すると、同時要求が発生します。
元。
ThreadA: val = e.getTxnQuota(); val = 5
ThreadB: val = e.getTxnQuota(); val = 5
ThreadA: e.setTxnQuota(val- 1); val = 4
ThreadB: e.setTxnQuota(val- 1); val =4
ThreadA: eDao.save(e);
ThreadB: eDao.save(e);
上記の場合、保存される値は 3 ではなく 4 です。
では、トランザクション クォータを確認して User エンティティを更新できるアトミック トランザクションを作成する方法はありますか?