Sql DELETE死锁

时间:2016-01-11 14:10:50

标签: mysql spring oracle hibernate h2

我们的应用程序是在Spring 4 + Hibernate 4中编写的,并在两个节点上运行。在每个晚上我们都想运行cron job(@Scheduled;让我们说凌晨2点)执行DELETE查询(负责清理db表)。表可以包含很多条目(~60mln),我们可能会一次删除30mln。由于有两个节点,它将被执行两次,我们可能会在桌面上出现死锁(我是对的吗?)。如何应对这个问题(乐观锁定,悲观锁定,其他一些解决方案)?我们想要做的是仅在一个节点上运行删除操作,并在另一个节点上阻止它。

修改 克隆节点但使用相同的数据库服务器(oracle或mysql)。

Server A                         Server B
(application)                    (application)
 |                                |
cron                             cron
(executed every day at 2am)      (executed every day at 2am)
 |                                |
 |                                |
  \          sql server          /
           (oracle or mysql)

Cron只是一个弹簧@scheduled方法,如下所示:

@Scheduled(cron = "0 0 2 * * *")
public void deleteEntries() {
    final String queryString = "DELETE FROM MyDto m WHERE date<:date";

    Query query = entityManager.createQuery(queryString);
    query.setParameter("date", new Date());
    query.executeUpdate();
}

总结一下,问题是: 查询是否可能失败(因为同时执行)?如果是 - 如何解决问题?

1 个答案:

答案 0 :(得分:0)

我决定使用quertz-scheduler,因此cron只能在一台服务器上同时执行。