Search code examples
scheduled-taskstypo3extbaseconcurrentmodification

Extbase: implement locking for concurrent access


In my extension I have a set of operations that are generated by user activities. Each operation consists of several steps.

To handle those operations I implemented a scheduler task (extension "scheduler" 6.2.0). Now the point is: steps of each operation must be done one after the other, not parallel. That means: at start the scheduler task should find next "free" operation, lock it and handle it.

For locking purposes database table with operations has an integer column "isLocked". So I wanted to use following SQL statement to lock an operation:

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

After this SQL command I wanted to check if lock was set:

$repository->findOneByIsLocked($lockID);

If locking was successful operation step handling can start.

If meanwhile another instance of scheduler task locks this operation, the SQL statement above does nothing because of condition: WHERE isLocked = 0.

The problem is: Extbase ignores SQL UPDATE-statements.

If I just update the free operation object via repository the lock of another task instance can be overwritten. I need some kind of "conditional" update.


Solution

  • I think I got it: $GLOBALS['TYPO3_DB']->exec_UPDATEquery is the answer.

    The only question remaining is, if this method is also depricated in FLOW, like $query->statement of Repository.