2016-01-11 153 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只會在一臺服務器上同時執行。