Mysql / JDBC:死锁

时间:2015-05-22 09:34:51

标签: java mysql jdbc locking innodb

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

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

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

关键代码:

  1. 读取数据并计算(工作)
  2. 从Tomcat Pool获取连接并设置为autocommit = false
  3. 使用Statement发出“LOCK TABLES order WRITE”
  4. 按表格顺序打开Recordset(可更新)
  5. 对于Recordset中的每一行 - >如果不同,请从内存中对象
  6. 更新
  7. 对于尚未包含在数据库中的对象 - >插入数据
  8. 提交连接,关闭连接
  9. 步骤5/6有一个Commitcounter,以便每500次更改行被提交(以避免未提交50.000行)。在第一次运行中(因此没有锁定)这需要最多。 30秒/桌。

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

    我很乐意任何建议做得更好。

    摘要:复杂代码计算要与数据库同步的内存中对象。这个同步当前似乎锁定了自己,尽管它顺序锁定,更改解锁表没有任何异常抛出。但出于某种原因,行锁似乎仍然存在。

    亲切的问候

    其他信息: Mysql:show processlist列出没有活动连接(所有睡眠或等待表顺序上的表锁),而“show engine INNODB”报告了许多行锁(不幸的是我无法理解哪个事务意味着输出是非常神秘的) 。

1 个答案:

答案 0 :(得分:0)

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

然而奇怪的是,innotop显示我的另一个查询挂在一个完全不同的桌子上。虽然它对我有用,但我并不关心古怪: - )