在spring-hibernate应用程序中,它有一个业务事务,它将约会插入数据库,最后它会将约会号码返回给用户。
@Transactional
public int makeAppointment(Appointment a) {
step 1: read current appointments count (current appointments list size)
step 2: check appointment count exceed with the new record
step 3: if not, save new appointment
step 4: return count+1
}
如果两个或多个线程(请求)同时进入此事务,则有可能读取错误的约会计数。避免这种情况的最佳方法是什么?
谢谢!
P.S:Serializable事务隔离级别可能会解决此问题。但由于它一次将整个过程限制在一个线程中,它是否会降低大规模应用程序中的可观性能?
答案 0 :(得分:1)
您可以在其他实体中增加计数,并在另一个实体上使用乐观锁定,以便在另一个事务尝试同时增加计数时回滚事务:
如果某个其他事务已更新计数,Hibernate将检测AppointmentStatistics实体的version字段中的更改,并且事务将回滚。