休眠:如何在争用/高并发下推理出乐观锁定异常?

时间:2019-03-16 17:34:18

标签: java mysql database hibernate concurrency

我通过Hibernate在数据库中具有以下结构。我在MySQL上操作。该结构是一个带有简单计数器的表格,该计数器描述了事件(列)每天发生的频率(计数列)。

@Entity
@Table(name="daily_log")
public class DailyLog {
    @Version
    @Column(name="opt_lock_v")
    protected Integer version;

    @Column(name="day")
    @Temporal(TemporalType.DATE)
    private Date day;

    @Column(name="count")
    private Integer count;
}

在我的应用程序中,我只是简单地执行以下操作:

DailyLog log = dailyLogRepository.findLogEntry(new Date()); // get row by current day
log.setCount(log.getCount() + 1); // increment count by 1

然后在我的应用程序中,我从数据库中读取更新的计数,即log.getCount()

在高负载/高争用情况下,更新计数器的代码将引发OptimisticLockException,这是Hibernate版本控制机制中的问题。

如何避免此类并发问题?将并发管理委托给MySQL而不是Hibernate是否安全?实现触发器或视图并让DBMS处理并发性有意义吗?

我正在考虑的另一个选项是异步数据库写入/更新,但是由于我稍后需要读取此计数器,因此我确实需要保证DBMS已成功进行更新,因此我不确定是否进行异步操作。一个办法。为了澄清起见,如果我向DBMS发送更新命令,我想阅读此更新,但是我不想进行阻塞操作,这可能会降低吞吐量。

在一天结束时,我想执行一个简单的增量操作,保持高吞吐量,避免并发问题,并读取我可能读取的最新计数器。

我对Hibernate还是很陌生,所以如果问题不清楚,我们深表歉意。

0 个答案:

没有答案