mysql - Sql DELETE死锁

标签 mysql spring oracle hibernate h2

我们的应用程序是用 Spring 4 + Hibernate 4 编写的,并在两个节点上运行。每天晚上我们都想运行 cron 作业(@Scheduled;假设在凌晨 2 点)执行 DELETE 查询(负责清理数据库表)。表可以包含很多条目(约 6000 万),我们可能会一次删除 3000 万。由于有两个节点,它将被执行两次,并且可能会在表上出现死锁(我是对的吗?)。如何应对这个问题(乐观锁、悲观锁、其他解决方案)?我们想要做的是仅在一个节点上运行删除操作,并在另一节点上阻止它。

编辑 节点被克隆,但使用相同的数据库服务器(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 只是一个 spring @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();
}

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

最佳答案

我决定使用 quertz-scheduler,这样 cron 将同时只在一台服务器上执行。

关于mysql - Sql DELETE死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723554/

相关文章:

mysql - 如何在 MySQL ansi 查询中使用 Between ?

sql count() 查询表

Java 数据库编程 - 为什么这些值不是 "equal"?

asp.net - 测试 Oracle 存储过程的最简单方法

java - Mysql ClusterJ 插件

java - webapps 的 Spring 配置 -> WEB-INF 中的位置是强制的吗?

spring - 如何使用条件或 spring jpa 进行搜索

java - 从 portlet 将图像上传到 liferay 主题

oracle - 如何连接到 R 中的 Oracle 数据库?

java - Oracle调用另一台机器上的Java方法