2016-04-30 91 views
0

在我的擴展中,我有一組由用戶活動生成的操作。每個操作由幾個步驟組成。Extbase:爲併發訪問實現鎖定

爲了處理這些操作,我實現了一個調度程序任務(擴展「調度程序」6.2.0)。現在重點是:每個操作的步驟必須一個接一個地完成,而不是平行的。這意味着:在開始時,調度程序任務應該找到下一個「空閒」操作,將其鎖定並處理。

對於鎖定目的,帶有操作的數據庫表具有「isLocked」整數列。所以,我想用下面的SQL語句來鎖定操作:

$lockID = time(); 'UPDATE operations SET isLocked = '.$lockID.' WHERE isLocked = 0 AND uid = '.$freeOperationFound->getUid().';

這個SQL命令,我想檢查之後,如果鎖設置:

$repository->findOneByIsLocked($lockID); 

如果鎖定了操作步驟成功處理可以開始。

如果與此同時調度程序任務的另一個實例鎖定此操作,則上面的SQL語句不會執行任何操作,因爲條件:WHERE isLocked = 0

問題是:Extbase忽略SQL UPDATE語句。

如果我只是通過庫更新自由操作對象,則可以覆蓋另一個任務實例的鎖定。我需要某種「有條件的」更新。

+0

你怎麼稱呼你的SQL語句?爲什麼不使用extbase來更新對象?如果您沒有充分的理由不使用extbase並需要幫助,我會寫出詳細的答案。 – sven

+0

問題是:我不能調用這個SQL語句,因爲Extbase忽略它。 如果我更新對象 - 我冒着覆蓋另一個實例的鎖的風險,該鎖設置它在我的讀寫操作之間鎖定。 - 是的! - 如果你能寫一些更多的細節,我將非常感激。 – firelex

回答

0

我想我明白了:$GLOBALS['TYPO3_DB']->exec_UPDATEquery就是答案。

剩下的唯一問題是,如果這個方法也在FLOW中被刪除,如Repository的$query->statement

0

儘管DatabaseConnection類中的exec_UPDATEquery函數確實完成了工作,但下面是通過extbase解決方案。如果在鎖定操作對象後需要使用操作對象,這可能會更有意義。

您需要手動持久保存的原因是,您的任務不在ActionController Action的上下文中。即使你是,它也不會自動持續你的改變,直到行動結束。通過extbase做它可能是更安全的選擇,因爲你可以確定實際上工作在你剛纔鎖定的完全相同的操作上。

+0

我認爲它不會去: 如果在此期間另一個實例試圖鎖定相同的記錄: 看看這個場景: ** A **'... $ repository-> findOneByIsLocked(0);' (0);' ** A **'...-> setIsLocked(time());' ** ** ** $ repository-> findOneByIsLocked > update($ freeOperation);' ** A **'$ persistenceManager-> persistAll();' ** B(出於某種原因後來爲A)**'...... - > setIsLocked(時間());' ** **乙'$ repository->更新($ freeOperation);' ** **乙'$ persistenceManager-> persistAll();' 我們得到的是: 「A」認爲它鎖定的記錄,「B」認爲它做到了! – firelex