gpt4 book ai didi

hibernate - 无法解决 Grails 2.4.5 中的 HibernateOptimisticLockingFailureException

转载 作者:行者123 更新时间:2023-12-02 14:41:39 26 4
gpt4 key购买 nike

我已经尝试了很多小时来弄清楚为什么我无法解决这个问题,但无济于事。

基本上,我有一个域类(PrizeSchedule),它在我的应用程序中用于安排何时发放奖品。当一个请求进来并且是时候发放奖品(预定时间比现在少)时,它将分配该奖品并将其标记为已处理。

这意味着,如果参赛作品之间有足够的时间过去,则可能有 2 个或更多奖品可供赠送。当我直接使用 10 个(或更多)请求测试我的应用程序时,在这种情况下,我总是在一些请求上遇到以下问题:

optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

我试过使用prizeScheduleInstance.merge 和prizeScheduleInstance.lock,但同样的错误弹出。很长一段时间后,我发现 PrizeSchedule.find() 调用没有产生正确的结果。尽管先前的请求已完成以下操作,但似乎:
prizeSchedule.setProcessed(true);
prizeSchedule.setReferenceNumber(prizeSchedule.generateToken());
prizeSchedule.save(flush:true);

下一个请求仍然能够找到已处理的 PrizeSchedule 实例,您可以在下面的日志中看到这里

请求 1:
2015-07-13 22:05:28,915 [http-bio-8080-exec-7] DEBUG PrizeService  - Session ID: 603 won prize ID: 103314

要求 2:
2015-07-13 22:05:30,136 [http-bio-8080-exec-12] DEBUG PrizeService  - Session ID: 604 won prize ID: 103314

如您所见,第二个请求仍然以某种方式找到了 PrizeSchedule 实例,即使已处理标志已被标记为 true。

我尝试了这个查询的变体来查找 PrizeSchedule 实例,它们都产生了相同的问题,下面是我尝试过的问题
PrizeSchedule ps = PrizeSchedule.findByCampaignAndDateScheduledLessThanAndProcessed(campaign, new Date(), false, [cache: false])


PrizeSchedule ps = ps = PrizeSchedule.find("FROM PrizeSchedule ps WHERE ps.campaign = :campaign AND ps.processed = :processed AND ps.dateScheduled < :now ORDER BY ps.dateScheduled ASC",
[campaign: campaign, processed: false, now: new Date()], [cache: false]
)

万一这很重要 - 我调用了一个服务来处理请求的 Controller ,这反过来又调用了其他 groovy/src 代码,这些代码通过
def prizeService = Holders.grailsApplication.mainContext.getBean 'prizeService'

这是因为在这些领域中使用了通用接口(interface)和抽象类。

我希望有人可以提供帮助,并提前感谢您花时间阅读本文!

最佳答案

好的,我将其发布为我的问题的解决方案,以防万一其他人将来遇到此问题。这可能很明显,但作为 Grails 的新手,我发现这很难解决/查找相关信息。

基本上我的 Controller 被注释了

@Transactional(readOnly = true)

并且进行实际处理的方法被注释为
@Transactional

最后,服务本身也被注释了
@Transactional

我的假设是让这些注释以某种方式混合了在 Hibernate session 中访问和存储数据时使用的事务。从我的 Controller 中删除注释(并调整代码)并将我的服务作为@Transactional 组件后 - 一切都开始按我预期的那样工作。

我希望这可以帮助像我一样受苦的人!

关于hibernate - 无法解决 Grails 2.4.5 中的 HibernateOptimisticLockingFailureException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392801/

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