2016-01-11 124 views
0

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

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

综上所述,问题是: 有没有可能查询会失败(因为在执行同时)?如果是 - 如何解决问题?

+0

你在运行mysql还是oracle? – kevinsky

+0

两者。这取决于客户。 – pepuch

+0

那么你是在运行两个节点的Oracle RAC还是两个节点的MySQL?您需要向我们提供有关您的设置的更多详细信息 – kevinsky

回答

0

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