在我的扩展中,我有一组由用户活动生成的操作。每个操作包括几个步骤。
为了处理这些操作,我实现了一个调度程序任务(扩展"调度程序" 6.2.0)。现在重点是:每个操作的步骤必须一个接一个地完成,而不是并行。这意味着:在开始时,调度程序任务应该找到下一个" free"操作,锁定并处理它。
对于锁定目的,具有操作的数据库表具有整数列" isLocked"。所以我想使用以下SQL语句来锁定操作:
$lockID = time();
'UPDATE operations SET isLocked = '.$lockID.' WHERE isLocked = 0 AND uid = '.$freeOperationFound->getUid().';
'
在此SQL命令之后,我想检查是否设置了锁:
$repository->findOneByIsLocked($lockID);
如果锁定成功,可以开始操作步骤处理。
如果同时调度程序任务的另一个实例锁定此操作,则由于条件:WHERE isLocked = 0
,上面的SQL语句不执行任何操作。
问题是:Extbase忽略SQL UPDATE语句。
如果我只是通过存储库更新自由操作对象,则可以覆盖另一个任务实例的锁定。我需要某种"条件"更新
答案 0 :(得分:0)
我想我明白了:$GLOBALS['TYPO3_DB']->exec_UPDATEquery
就是答案。
唯一剩下的问题是,如果此方法也在FLOW中被删除,例如存储库的$query->statement
。
答案 1 :(得分:0)
虽然DatabaseConnection类中的exec_UPDATEquery函数当然可以完成工作,但这是通过extbase的解决方案。如果在锁定后需要使用Operation对象,可能会更有意义。
$persistenceManager = GeneralUtilities::makeInstance('TYPO3\CMS\extbase\Persistence\PersistenceManager');
$freeOperation = $repository->findOneByIsLocked(0);
$freeOperation->setIsLocked(time());
$repository->update($freeOperation);
$persistenceManager->persistAll();
$freeOperation->myOperation();
$freeOperation->myOtherOperation();
$freeOperation->setIsLocked(0);
$repository->update($freeOperation);
$persistenceManager->persistAll();
您需要手动持久的原因是,您的任务不在ActionController Action的上下文中。即使你是,它也不会自动保持你的更改,直到Action结束。通过extbase执行它可能是更安全的选择,因为您可以确保实际处理刚刚锁定的完全相同的操作。