【问题标题】:How to handle concurrent sql updates, given database structure can change at runtime如何处理并发 sql 更新,给定的数据库结构可以在运行时更改
【发布时间】:2014-11-06 10:19:03
【问题描述】:

我正在开发 spring mvc 应用程序

目前我正在使用 innodb mysql,但我还必须开发应用程序以支持其他数据库。

谁能建议我如何处理单个记录上的并发 sql 更新。

假设两个用户正在尝试更新相同的记录,那么如何处理这种情况。

注意:我的数据库结构依赖于一些配置(它可以在运行时改变),我的 spring 控制器本质上是单例的。

谢谢。

更新: 仅供参考,我将实现类似https://stackoverflow.com/a/3618445/3898076) 的版本。

【问题讨论】:

  • 如果你使用JPA,你可以使用悲观锁或乐观锁。 See Here
  • 感谢您的回复。您想说我可以使用 JPA 并创建代表我的表的实体,然后使用这些实体进行查询。我的理解是否正确。如果是,那么我在问题中提到我的数据库结构可以在运行时更改,您能否告诉我如何使用实体处理此类更改。
  • “可以在运行时改变”是什么意思?在运行时修改应用程序的架构通常是一个糟糕的主意...
  • 我知道在运行时更改架构不好。但我的要求是基于一些配置我必须生成表。架构更改并不经常..

标签: java mysql sql concurrency


【解决方案1】:

在并发 sql 更新方面,事务是要走的路,春天你可以使用事务管理器。

关于数据库结构,据我所知MySql不支持DDL命令的事务,也就是说,如果你在更新的同时改变结构,你很可能会遇到问题。

要处理处理相同数据的多个用户,您需要在表上实现手动“锁定”或“版本”字段以跟踪上次更新。

【讨论】:

  • 我对春季交易不太了解。但是你能告诉我吗,假设两个用户在编辑屏幕上加载了相同的记录,并且两个用户都以 5 秒的间隔更新了记录的某些字段。那么transaction stop/throw any exception会在这种情况下吗?
  • 没有。并且没有数据库事务系统可以帮助您 - 保持数据库事务打开并等待用户输入是疯狂的。在这种情况下,您必须手动执行此操作,使用该表上的“锁定”或“版本”字段。
  • 感谢您的回复。但是在这种情况下,锁怎么能有用呢?我已经阅读了版本,但是用版本字段重写查询对我来说是相当大的努力。所以,如果没有其他方法可以实现这一点,那么我将不得不用版本重写我的代码。
  • 要么接受,要么接受第二个用户将覆盖第一个用户的更改
  • 感谢您的帮助。现在,我将在我的代码中实现版本字段(如stackoverflow.com/a/3618445/3898076)。您能否更新您的建议版本以及事务管理器的答案,以便我接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2021-03-04
  • 2017-05-26
  • 2021-01-08
相关资源
最近更新 更多