Я думаю, вам лучше установить идентификатор пользователя и начальную дату при запуске.
Когда вы обновляете базу данных следующим образом -
UPDATE task t
SET t.userid = :USERID, t.lastprogress = sysdate()
WHERE t.userid is null and t.taskid = :TASKID
- вы заметите 0 измененных записей, когда задача уже назначена пользователю.Это решает вашу первую проблему.
Затем, когда вы сохраняете дату последнего изменения, вы можете запустить задание cron, чтобы очистить оставленные задания, будучи заданиями, которые не были изменены в течение определенного периода времени.Но это совсем другая проблема.Трудно найти правильный баланс для принятия слишком раннего или слишком позднего решения о том, отменена ли задача или нет.
Если каждая модификация также обновляет эту дату, пользователь может даже работать над задачей в течение более длительного времени, безэто было украдено кем-то еще, пока они регулярно сохраняют.Кроме того, при сохранении данных модификации (вы можете написать подпрограмму для этого), вы можете проверить, совпадает ли идентификатор пользователя.Если ИД пользователя задачи НЕДЕЙСТВИТЕЛЕН (cron решил «покинутый») или другой ИД пользователя (заброшенная задача была подхвачена кем-то другим), вы можете вызвать ошибку, чтобы сообщить пользователю, что задача больше не принадлежит ему.