用spring和hibernate访问数据库的同步方法

时间:2019-07-05 06:54:34

标签: java spring hibernate synchronized

我有一个表,该表维护一个序列号,该序列号用作多个表的标识符(多个发票表,所有表都使用单个序列)。 每当我想在发票表中插入新记录时,我都会从表中读取当前序列号,并用+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;
}

有什么我想念的吗?

2 个答案:

答案 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();
}

因此,每当发生冲突时,都会引发异常。