我创建了一个实体用户,它具有整数属性交易配额。我需要根据其价值更新交易配额。
如果大于 0,则需要递减,否则需要保留其值。
所以这是我的算法。
- 从数据库中检索用户实体。
- 检查事务配额,如果事务配额大于0,则减一。
- 保留更改的用户实体。
在上述情况下,当并发请求出现时,如果两个线程检索相同的用户实体,然后两个线程都读取相同的事务配额值,如果它大于 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);
在上述情况下,保存的值是 4 而不是 3。
那么有什么方法可以创建一个原子事务,我可以在其中检查事务配额并更新用户实体?