Quartz 调度程序在 qrtz 表中创建触发器/作业时出现死锁

发布于 2024-10-31 09:50:29 字数 978 浏览 4 评论 0原文

我正在为预定时间创建一个主 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叶落知秋 2024-11-07 09:50:29

您是否使用 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文