使用休眠锁定进行并发控制

时间:2019-10-08 05:09:46

标签: postgresql hibernate locking

我尝试锁定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();

锁定流程我想念的是什么线索?

0 个答案:

没有答案