如何在mysql中连续更新表的行,保持数据的一致性

时间:2017-09-22 16:24:57

标签: java mysql spring hibernate acid

如何在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方法,这也不是很有前途的数据一致性。

是否有任何其他方法可以确保在某些并发操作集之后数据的一致性。

0 个答案:

没有答案