我有一个表,该表维护一个序列号,该序列号用作多个表的标识符(多个发票表,所有表都使用单个序列)。 每当我想在发票表中插入新记录时,我都会从表中读取当前序列号,并用+1更新。 问题是当有多个新发票编号请求时,序列号返回重复编号。我尝试了同步块,但是当同时遇到多个请求时,它仍然返回重复值。
这是检索序列号的方法
synchronized public int getSequence(){
Sequence sequence = getCurrentSession().get(Sequence.class,1); //here 1 is the id of the row
int number = sequence.getSequenceNumber();
sequence.setSequenceNumber(number+1);
getCurrentSession().saveOrUpdate(sequence);
return number;
}
有什么我想念的吗?
答案 0 :(得分:0)
首先,我不建议您使用序列的表实现。 Explanation why
但是,如果您必须-休眠知道如何进行管理。 Take a look
还有一件事。我强烈建议您在数据库端实现同步。假设您有两个应用程序实例连接到同一数据库实例并同时工作。
答案 1 :(得分:0)
使用交易对我也不起作用。我在mysql中尝试了所有隔离措施,但没有任何帮助。我通过以下解决方案解决了该问题。
synchronized public int getSequence(){
Sequence sequence = getCurrentSession().get(Sequence.class,1); //here 1 is the id of the row
int prevNumber = sequence.getSequenceNumber();
Query<Sequence> query = getCurrentSession().createQuery("UPDATE Sequence SET sequenceNumber = :number WHERE sequenceNumber = :prevNumber",Sequence.class);
query.setParameter("number",prevNumber+1);
query.setParameter("prevNumber",prevNumber);
int affectedRows = query.executeUpdate();
if(accectedRows > 0)
return number;
else
throw new Exception();
}
因此,每当发生冲突时,都会引发异常。