如何在mysql中更新表的行,以保持数据的一致性。
例如:
Algo :
do{
CreditBalance credit = getCreditBalance(initialDeductionCreditRequest.getUserId(),
creditMetadata.getId());
if (credit.getBalance() >= cost) {
final Integer newBalance = credit.getBalance() - cost;
credit.setNewBalance(newBalance);
rowsUpdated = compareAndSetBalanceForUser(credit.getBalance(), newBalance,
credit.getUserId(), balanceCredit.getCreditId());
}
}while (rowsUpdated == 0);
- getCreditBalance包含Query,它根据i / p标准检索用户余额
public Integer compareAndSetBalanceForUser(Integer oldBalance, Integer newBalance, String userId,
Integer creditId) {
Session session = sessionFactoryCoreServices.getCurrentSession();
Query query = session.createQuery(
"**update CreditBalance cb set cb.balance = :newBalance , modified_date = NOW() where cb.balance = :oldBalance and cb.userId = :userId and cb.creditId = :creditId**");
query.setParameter("newBalance", newBalance);
query.setParameter("oldBalance", oldBalance);
query.setParameter("userId", userId);
query.setParameter("creditId", creditId);
return query.executeUpdate();
}
我有一个用例,我需要更新特定用户的余额,保持信用余额一致。
我同时使用20个线程运行我的代码,上面的代码没有很好的数据一致性。
我甚至尝试过SELECT FOR UPDATE方法,这也不是很有前途的数据一致性。
是否有任何其他方法可以确保在某些并发操作集之后数据的一致性。