Слишком широкая блокировка: достаточно защищать только эту строчку. В случае, если в транзакции уже запись есть - блокировка вообще не нужна.