mysql - 关于spring/jpa/hibernate中乐观锁的简单设计问题

标签 mysql hibernate spring jpa optimistic-locking

我有一个 GeneralKnowledgeTest 对象,它包含许多统计字段(ratingsCount、responsesCount、ratingStars ...),每次用户参加该测试时都会更新这些字段(takeTest() -> 事务方法)。

可能会发生许多用户同时参加相同测试的情况,所以我在考虑实现一个乐观锁定(@version)和一个拦截器,该拦截器在抛出乐观锁定异常的情况下重试 takeTest 方法。

所以,在 takeTest 方法中,我总是得到一个新的 GeneralKnowledgeTest 实例,例如entityManager.find(testId),然后更新其统计字段。如果抛出乐观异常,拦截器将简单地重试 takeTest 方法,直到成功。

您对此程序有何看法。这是为可能有很多用户尝试进行相同测试的系统实现乐观锁定的好方法吗?

附言。如果抛出乐观锁异常,业务不会承认显示任何警告消息,因此必须使用拦截器才能顺利执行...

最佳答案

我假设这些统计数据仅在测试结束时更新,并且测试需要合理的运行时间,因此这将降低乐观锁失败的可能性。另外,用户是否有可能突然完成测试,例如,在设定的时间开始测试?这会增加锁定失败的可能性。

如果吞吐量仍然可能导致并发更新,那么您最好在内存中聚合统计信息(以线程安全的方式)并定期将它们写入数据库。

关于mysql - 关于spring/jpa/hibernate中乐观锁的简单设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159285/

相关文章:

java - 为什么Hibernate会忽略@Column注解的name属性?

java - Intellij Idea 看不到 .yaml 文件中的值,但成功引用了 @Value 中的 .properties

java - 使用resttemplate解析json

MySql 错误 150 - 外键

mysql - 在 MySQL 中,我可以编写一个查询来查找给定月份是否在两个日期之间有任何日期吗?

java - 使用 sql 查询在 hibernate 中创建一个新的对象实例

java - Hibernate不会从模型到数据库生成表

java - Spring Quartz 计划任务在一段时间后停止运行

javascript - 我想使用文件上传选项将多个图像路径保存到 mysql 数据库?我正在使用一个将其他数据输入数据库的表单

php - MySQL 中的 SUM 与 ORDER BY 和 LIMIT