Extbase:实现锁定以进行并发访问

时间:2016-04-30 15:34:33

标签: scheduled-tasks typo3 extbase concurrentmodification

在我的扩展中,我有一组由用户活动生成的操作。每个操作包括几个步骤。

为了处理这些操作,我实现了一个调度程序任务(扩展"调度程序" 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语句。

如果我只是通过存储库更新自由操作对象,则可以覆盖另一个任务实例的锁定。我需要某种"条件"更新

2 个答案:

答案 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执行它可能是更安全的选择,因为您可以确保实际处理刚刚锁定的完全相同的操作。