Quartz 调度程序在 qrtz 表中创建触发器/作业时出现死锁
我正在为预定时间创建一个主 cronjob,从该作业中,我将立即创建 10 个 simpletrigger 作业,并为每个 simpletriger 作业创建另一组 100 个作业。
我使用 spring,线程池大小为 30,使用 h2 数据库、JobStoreTX、StdJDBCDelegate 进行数据库连接。我的应用程序是一个独立的java程序,它启动主要工作。
它在 qrtz 表中创建了第一组作业详细信息/触发器详细信息。当它执行第一个跨越子作业的简单作业时,它会在触发器和作业条目上获得表锁。
可能是什么问题?
例外是: “由以下原因引起:org.h2.jdbc.JdbcSQLException:检测到死锁。当前事务已回滚。详细信息:” 会话#64(用户:SA)正在等待锁定 PUBLIC.QRTZ_SIMPLE_TRIGGERS,同时锁定 PUBLIC.QRTZ_TRIGGERS(独占)。 会话#67(用户:SA)正在等待锁定 PUBLIC.QRTZ_TRIGGERS,同时锁定 PUBLIC.QRTZ_SIMPLE_TRIGGERS(独占)。”;SQL 语句: 插入 qrtz_SIMPLE_TRIGGERS (TRIGGER_NAME、TRIGGER_GROUP、REPEAT_COUNT、REPEAT_INTERVAL、TIMES_TRIGGERED) VALUES(?, ?, ?, ?, ?) [40001-132] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:316) 在 org.h2.message.DbException.get(DbException.java:167) 在 org.h2.message.DbException.get(DbException.java:144) 在 org.h2.table.RegularTable.doLock(RegularTable.java:435) 在 org.h2.table.RegularTable.lock(RegularTable.java:382)"
Am creating a main cronjob for a scheduled time, from that job am creating 10 simpletrigger jobs without delay and for each simpletriger job am creating another set of 100 jobs.
Am using spring and my thread pool size is 30, am using h2 database, JobStoreTX, StdJDBCDelegate for database connection. My app is an standalone java program which initiates the main job.
It created the first set of jobdetail/ trigger detail in the qrtz tables. when it executes the first simple job spanning sub job's got a table lock on trigger and job entries.
What might be the issue?
Exception is :
"Caused by: org.h2.jdbc.JdbcSQLException: Deadlock detected. The current transaction was rolled back. Details: "
Session #64 (user: SA) is waiting to lock PUBLIC.QRTZ_SIMPLE_TRIGGERS while locking PUBLIC.QRTZ_TRIGGERS (exclusive).
Session #67 (user: SA) is waiting to lock PUBLIC.QRTZ_TRIGGERS while locking PUBLIC.QRTZ_SIMPLE_TRIGGERS (exclusive)."; SQL statement:
INSERT INTO qrtz_SIMPLE_TRIGGERS (TRIGGER_NAME, TRIGGER_GROUP, REPEAT_COUNT, REPEAT_INTERVAL, TIMES_TRIGGERED) VALUES(?, ?, ?, ?, ?) [40001-132]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:316)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.table.RegularTable.doLock(RegularTable.java:435)
at org.h2.table.RegularTable.lock(RegularTable.java:382)"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您是否使用 H2 的 mvcc 模式 - 这是启用行锁定所必需的(据我所知),而不是表锁定? (很像带 InnoDB 的 MySQL 和不带 InnoDB 的 MySQL 之间的区别)。
http://jira.opensymphony.com/browse/QUARTZ-773
Are you using mvcc mode of H2 - which is required (as far as I understand it) for row locking to be enabled, rather than table locking? (much like the difference between MySQL with and without InnoDB).
http://jira.opensymphony.com/browse/QUARTZ-773