1

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

任何人都可以提供某种摆脱这种困境的方法吗?如此高的访问权限应该采用什么样的方法(始终从同一个表中不断读取和写入)?任何帮助将不胜感激。

4

2 回答 2

1

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

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

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

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

于 2011-05-09T13:30:41.423 回答
0

lock_wait_timeouts 是事务性数据库的生活事实。正常的响应通常应该是捕获错误并尝试重新运行事务。似乎没有多少开发人员理解这一点,因此需要重复一下:如果您收到 lock_wait_timeout 错误并且您仍想提交事务,则再次运行它。

其他需要注意的事项是:

  • 持久连接和不显式提交事务会导致长时间运行的事务,从而导致不必要的锁定。
  • 由于您已关闭自动提交,因此如果您从 mysql CLI(或任何其他交互式查询工具)登录并开始运行查询,您很有可能会锁定行而不是及时释放它们。
于 2009-11-09T14:35:15.383 回答