gpt4 book ai didi

java - mysql/jdbc : Deadlock

转载 作者:行者123 更新时间:2023-11-29 22:24:33 25 4
gpt4 key购买 nike

我有一台 J2EE 服务器,当前仅运行一个线程(即使在一个请求内也会出现问题)以将其内部数据模型保存到 MySQL/INNODB 表。

基本思想是从平面文件中读取数据,进行大量计算,然后将结果写入MySQL。第二天读取另一组平面文件并重复步骤 1。由于只有一小部分行发生更改,我使用已写入行的记录集,与内存中的当前结果进行比较,然后相应地更新/插入它(没有删除,只是设置一个deletedFlag)。

问题:尽管是一个纯粹的顺序过程,但我遇到了锁定超时错误(#1204)并且 Innodump 显示记录锁定(尽管我不知道如何计算细节)。让事情变得复杂的是,在我的 Windows 机器下一切正常,而生产系统(我无法安装 innotop)有一些记录锁。

关键代码:

  1. 读取数据并计算(有效)
  2. 从 Tomcat 池获取连接并设置为 autocommit=false
  3. 使用语句发出“LOCK TABLES order WRITE”
  4. 按表顺序打开记录集(可更新)
  5. 对于 Recordset 中的每一行 --> 如果存在差异,则从内存对象中更新
  6. 对于尚未在数据库中的对象 --> 插入数据
  7. 提交连接、关闭连接

步骤 5/6 有一个提交计数器,以便每 500 个更改都会提交行(以避免有 50.000 行未提交)。在第一次运行中(因此没有任何锁),这需要最多。 30秒/ table 。

如上所述,现在我避免与数据库进行任何其他交互,但在将来的其他进程(用户请求)中可能会读取数据甚至写入某些字段。我不介意这些进程读取旧/新数据并等待几分钟来保存对数据库的更改(即锁定)。

我很乐意接受任何比这更好的建议。

摘要:复杂的代码计算要与数据库同步的内存对象。目前,此同步似乎会自行锁定,尽管事实上它是按顺序锁定的,更改会解锁表而不会引发任何异常。但由于某种原因,行锁似乎仍然存在。

亲切的问候

附加信息:Mysql:显示进程列表没有列出任何 Activity 连接(全部处于 sleep 状态或等待表顺序上的表锁),而“显示引擎 INNODB”报告了许多行锁(不幸的是,我无法理解哪个事务是指哪个事务,因为输出相当神秘) 。

最佳答案

已解决:我错误地将 ResultSet 声明为可更新。 ResultSet 仅在通过垃圾收集器的“finalize()”方法上关闭,该方法速度不够快 - 在我重新打开 ResultSet 并尝试获取已锁定表上的锁之前。

但奇怪的是,innotop 显示我的另一个查询卡在完全不同的表上。虽然它对我有用,但我不关心奇怪的事情:-)

关于java - mysql/jdbc : Deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30393227/

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