Transaction+selectforupdate (concurrency check) + check if this action already happened (idempotent check) + avoid unexpected transaction large roll back (
The messy real world: not just 1 submission of review, rather many others submission so transaction takes longer, need to be careful to not raise errors in submission functions due to atomicity of transaction! Consider a solution is to have a wide try except Exception to catch all errors y one safe.