optimization might be to only lock if Payload.Conflicts() exists (how often does this happen?)