如何解决lock_wait_timeout,后续回滚和从MySQL数据消失5.1.38

问题描述:

我正在使用顶级链接与struts 2和toplink高使用率的应用程序,应用程序总是访问单个表,每秒多次读取和写入。这会导致lock_wait_timeout错误并且事务回滚,导致刚输入的数据从前端消失。 (Mysql的自动提交已被设置为1)。该异常已被捕获并发送到应用程序中的错误页面,但仍会发生回滚(由于mysql没有打开回滚功能,它必须是toplink异常)。原始数据文件ibdata01显示在编辑器中打开时的条目。由于这种情况无法在测试条件下复制。如何解决lock_wait_timeout,后续回滚和从MySQL数据消失5.1.38

任何人都可以提供某种解决这种困境的方法吗?这种高访问方式应该采取什么样的方式(始终在同一个表上不断的读取和写入)?任何帮助将不胜感激。

lock_wait_timeouts是事务数据库的生活事实。正常的响应通常应该是捕获错误并尝试重新运行事务。并不是很多开发人员似乎都明白这一点,所以需要重复一遍:如果发生lock_wait_timeout错误,并且仍想提交事务,则再次运行它。其他

事情看出来的是:

  • 持久连接,而不是 明确COMMIT'ing您 交易导致导致 不必要的锁长时间运行 交易。
  • 因为你 具有自动提交了,如果你在 从MySQL CLI(或任何其他 交互式查询工具)登录,并开始 运行查询你站在锁定行 的 显著机会,在不释放他们及时采取 的方式。
+0

我不明白那种先生,我要求每trasaction后的实体管理器提交,这是不够的?在mysql中启用自动提交。请帮助。 – sam 2009-11-18 09:42:11

并发读取/更新的性质是什么?你是否不断从不同的会话更新相同的行?当两个会话同时更新同一行时,您希望发生什么?

如果读取与更新冲突,请考虑减少数据库上的事务隔离。

如果您有多个写冲突,那么您可以考虑使用悲观锁定来确保每个事务成功。但无论哪种方式,您都会遇到很多争议,因此可能会重新考虑您的数据模型或应用程序对数据的使用情况。

见, http://en.wikibooks.org/wiki/Java_Persistence/Locking