我尝试锁定Hibernate,但无法获得正确的结果。流程是,我记录余额历史记录的交易记录,从数据库中计算以获取帐户的当前余额,每条插入的新记录都将获得新的当前余额,并减去交易额,即数据库名称InvoiceItems,像这样我没有当前余额不一致的变动:
id | account_id | date | amount | current_balance | type
1 A 2019-09-08:09:11:43.122 10 10 Topup
2 A 2019-10-08:11:23:21.331 -1 9 Transaction
3 A 2019-10-08:11:23:21.571 -1 9 Transaction
4 A 2019-10-08:11:23:21.721 -1 9 Transaction
5 A 2019-10-08:12:45:19.012 -1 6 Transaction
6 b 2019-10-08:11:23:21.721 100 100 Topup
我如何在java中获得计算当前余额的查询是这样的:
public BigDecimal getBalance(String accountid) {
return (BigDecimal)this.session.createQuery("select SUM(amount) from InvoiceItems I WHERE account_id = '" + accountid + "' AND type='CBA_ADJ' ").setLockMode("I", LockMode.PESSIMISTIC_FORCE_INCREMENT).getSingleResult();
}
调用主函数:
InvoiceItemsDao ido = new InvoiceItemsDao(db);
InvoicesDao idio = new InvoicesDao(db);
String accountid = ido.getAccountId(jsonRecv.getString("externalkey"), tenantApiKey.getRecord_id());
BigDecimal balance = ido.getBalance(accountid); <-------- The locking query is here
LogSystem.info(request, "Balance before transaction : " + ido.getBalance(accountid));
InvoiceItems invoiceUsage = new InvoiceItems();
Accounts ac = ado.findByExternalKey(jsonRecv.getString("externalkey"), tenantApiKey.getRecord_id());
invoiceUsage.setAccount_id(ac.getId());
invoiceUsage.setAccount_record_id(ac);
invoiceUsage.setAmount(BigDecimal.valueOf(-jsonRecv.getLong("amount")));
invoiceUsage.setCreated_date(new Date());
invoiceUsage.setUsage_name("Transaction");
invoiceUsage.setCurrent_balance(balance.subtract(BigDecimal.valueOf(jsonRecv.getLong("amount"))));
db.session().save(invoiceItemsCBA_ADJ);
tx.commit();
锁定流程我想念的是什么线索?