我在远程网络服务器上有一个订购平台,在我的办公室有一台本地生产机器。两个网络服务器都访问同一个远程 MySQL (InnoDB) 数据库。
我的问题:生产需要几分钟,其中有 2-3 笔交易是开放的。在这个时候,我生成新的发票号码并增加它们。最新的发票编号保存在数据库的 Numbers-Table 中。
public Long getNewInvoiceNumber() {
Criteria crit = getSession().createCriteria(Numbers.class);
Numbers n = ((Numbers)crit.uniqueResult());
Long newNumber = n.getInvoiceNumber() + 1L;
n.setInvoiceNumber(newNumber);
return newNumber;
}
现在,当有人在生产过程中保存新订单时,他们正在访问相同的 Numbers-Table 以生成另一个编号(不是发票)。生产处理的所有订单都保存有正确的发票编号。但是,Numbers-Table 不会更新为最新值,并且发票编号与生产前相同。
我了解其中一项事务收到“陈旧表”消息。但是 MySQL / Hibernate / Java 的行为是什么?我想从其中一个事务中得到一个异常,这样我就可以回滚并且没有这种危险的数据库不一致。
编辑:
这是表格的Numbers
样子:
id | invoice_number | tag_number
0 | 16533 | 1055
id
是主键。我只访问这一行并增加所需的数量。
编辑 2: 好的,我看到这个表结构有点糟糕。我将其更新为:
id | number
invoice_number | 16533
tag_number | 1055
现在我可以独立访问每一行。不知道这是否解决了我的问题。