Use a transaction and FOR UPDATE to ensure the returned row is still in the database when we get to the update call. This was chosen over using Dataset#update, because of the later call to incr_destroy. If the runner has been deleted, likely the related strand has been deleted, and we probably don't want to create a semaphore for a strand that no longer exists.