gpt4 book ai didi

mysql - 将 Grails 与 PostgreSQL 一起使用时出现 org.hibernate.StaleObjectStateException

转载 作者:行者123 更新时间:2023-11-29 03:13:37 25 4
gpt4 key购买 nike

我用以下代码编写了一个 grails 服务:

EPCGenerationMetadata requestEPCs(String indicatorDigit, FilterValue filterValue,     
PartitionValue partitionValue, String companyPrefix, String itemReference,
Long quantity) throws IllegalArgumentException, IllegalStateException {

//... code
//problematic snippet bellow
def serialGenerator
synchronized(this) {
log.debug "Generating epcs..."
serialGenerator = SerialGenerator.findByItemReference(itemReference)
if(!serialGenerator) {
serialGenerator = new SerialGenerator(itemReference: itemReference, serialNumber: 0l)
}
startingPoint = serialGenerator.serialNumber + 1
serialGenerator.serialNumber += quantity
serialGenerator.save(flush: true)
}
//code continues...
}

作为默认情况下的单例 grails 服务,我认为通过在上面添加同步块(synchronized block)可以避免并发不一致。我创建了一个简单的客户端来测试并发性,因为该服务由 http 调用程序公开。我同时运行多个客户端,将相同的 itemReference 作为参数传递,完全没有问题。

但是,当我将数据库从 MySQL 更改为 PostgreSQL 8.4 时,我无法再处理并发访问。运行单个客户端时,一切都很好。但是,如果我再添加一个客户端请求相同的 itemReference,我会立即得到一个 StaleObjectStateException:

Exception in thread "main" org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [br.com.app.epcserver.SerialGenerator] with identifier [10]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [br.com.app.epcserver.SerialGenerator#10]      at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:672)      at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)      at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)      at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)      at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:881)      at org.codehaus.groovy.grails.orm.hibernate.metaclass.SavePersistentMethod$1.doInHibernate(SavePersistentMethod.java:58)      (...)      at br.com.app.EPCGeneratorService.requestEPCs(EPCGeneratorService.groovy:63)      at br.com.app.epcclient.IEPCGenerator$requestEPCs.callCurrent(Unknown Source)      at br.com.app.epcserver.EPCGeneratorService.requestEPCs(EPCGeneratorService.groovy:29)      at br.com.app.epcserver.EPCGeneratorService$$FastClassByCGLIB$$15a2adc2.invoke()          (...)  Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [br.com.app.epcserver.SerialGenerator#10]

注意:EPCGeneratorService.groovy:63 指的是 serialGenerator.save(flush: true)。

我不知道该怎么想,因为我唯一改变的是数据库。我将不胜感激有关此事的任何建议。

我正在使用:
Grails 1.3.3
Postgres 8.4 (postgresql-8.4-702.jdbc4 驱动)
JBoss 6.0.0-M4

MySQL:
mysqld Ver 5.1.41 (mysql-connector-java-5.1.13-bin 驱动)

提前致谢!

最佳答案

这很奇怪,请尝试禁用事务。

关于mysql - 将 Grails 与 PostgreSQL 一起使用时出现 org.hibernate.StaleObjectStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4277843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com