datajoint:超过锁等待超时错误

1wnzp6jl  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(377)

在尝试从表中删除时,我有时会 Lock wait timeout exceeded 错误。当许多人 .populate 命令(带 reserve_jobs=True )正在并行运行。删除这些作业(中止它们的执行)并重新启动不会立即起作用,但会在几分钟后起作用。你知道那里发生了什么吗?delete命令本身不应触及当前正在处理的数据集。

  1. InternalError Traceback (most recent call last)
  2. <ipython-input-16-c52a52b02f79> in <module>()
  3. ----> 1 MakeDatasetsSessions.populate()
  4. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\datajoint\autopopulate.py in populate(self, suppress_errors, reserve_jobs, order, limit, max_calls, display_progress, *restrictions)
  5. 135 call_count += 1
  6. 136 try:
  7. --> 137 make(dict(key))
  8. 138 except (KeyboardInterrupt, SystemExit, Exception) as error:
  9. 139 try:
  10. c:\work\python\dj-moser-imaging\dj_schemas\preprocess.py in make(self, key)
  11. 470 dataset_to_delete = (Dataset * Session.Data & 'session_name="{}"'.format(session_dict['session_name'])\
  12. 471 & 'datasettype="{}"'.format(datasettype)).fetch1('dataset_name')
  13. --> 472 (Dataset & 'dataset_name = "{}"'.format(dataset_to_delete)).delete()
  14. 473 except dj.DataJointError:
  15. 474 logger.error('Session {} for animal {}: Tried to delete datasets after mismatch was detected, but could not proceed. '.format(\
  16. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\datajoint\base_relation.py in delete(self, verbose)
  17. 358 try:
  18. 359 for r in reversed(list(delete_list.values())):
  19. --> 360 count = r.delete_quick(get_count=True)
  20. 361 total += count
  21. 362 if (verbose or safe) and count:
  22. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\datajoint\base_relation.py in delete_quick(self, get_count)
  23. 296 """
  24. 297 query = 'DELETE FROM ' + self.full_table_name + self.where_clause
  25. --> 298 self.connection.query(query)
  26. 299 count = self.connection.query("SELECT ROW_COUNT()").fetchone()[0] if get_count else None
  27. 300 self._log(query[:255])
  28. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\datajoint\connection.py in query(self, query, args, as_dict, suppress_warnings)
  29. 131 # suppress all warnings arising from underlying SQL library
  30. 132 warnings.simplefilter("ignore")
  31. --> 133 cur.execute(query, args)
  32. 134
  33. 135 except err.OperationalError as e:
  34. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\cursors.py in execute(self, query, args)
  35. 168 query = self.mogrify(query, args)
  36. 169
  37. --> 170 result = self._query(query)
  38. 171 self._executed = query
  39. 172 return result
  40. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\cursors.py in _query(self, q)
  41. 326 self._last_executed = q
  42. 327 self._clear_result()
  43. --> 328 conn.query(q)
  44. 329 self._do_get_result()
  45. 330 return self.rowcount
  46. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\connections.py in query(self, sql, unbuffered)
  47. 514 sql = sql.encode(self.encoding, 'surrogateescape')
  48. 515 self._execute_command(COMMAND.COM_QUERY, sql)
  49. --> 516 self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  50. 517 return self._affected_rows
  51. 518
  52. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\connections.py in _read_query_result(self, unbuffered)
  53. 725 else:
  54. 726 result = MySQLResult(self)
  55. --> 727 result.read()
  56. 728 self._result = result
  57. 729 if result.server_status is not None:
  58. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\connections.py in read(self)
  59. 1064 def read(self):
  60. 1065 try:
  61. -> 1066 first_packet = self.connection._read_packet()
  62. 1067
  63. 1068 if first_packet.is_ok_packet():
  64. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\connections.py in _read_packet(self, packet_type)
  65. 681
  66. 682 packet = packet_type(buff, self.encoding)
  67. --> 683 packet.check_error()
  68. 684 return packet
  69. 685
  70. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\protocol.py in check_error(self)
  71. 218 errno = self.read_uint16()
  72. 219 if DEBUG: print("errno =", errno)
  73. --> 220 err.raise_mysql_exception(self._data)
  74. 221
  75. 222 def dump(self):
  76. ~\AppData\Local\conda\conda\envs\analysis\lib\site-packages\pymysql\err.py in raise_mysql_exception(data)
  77. 107 errval = data[3:].decode('utf-8', 'replace')
  78. 108 errorclass = error_map.get(errno, InternalError)
  79. --> 109 raise errorclass(errno, errval)
  80. InternalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')
nxowjjhe

nxowjjhe1#

在常规的datajoint使用中很少会发生超时。如果出现这种情况,我们需要彻底了解问题,并提出建议,以帮助避免它们。
在您的示例中,makedatasetssessions的make方法似乎试图删除某些内容。从populate调用中删除不是标准做法,我们需要理解(a)为什么需要删除,以及(b)为什么这个特定的删除导致超时。
为了理解这一点,请您发布make方法和erd的代码,其中包括makedatasetssessions和从中删除的表?

相关问题