При оптимизации c блокировка строки, если вы попытаетесь обновить строку, уже измененную другим потоком, обновление, конечно, завершится неудачей.
И теперь текущая версия строки на самом деле другая строка , а не та (по крайней мере, для базы данных).
Как правило, у вас есть два варианта:
Считайте, что ваши изменения устарели, и потерять их, откатив всю транзакцию.
Обновите sh данные и попытайтесь восстановить новые изменения, объединяя обе новые его версии, так или иначе .
Мне кажется, что вы пытаетесь реализовать последнее. В этом случае вам нужно обновить sh данных, и это обязательно означает выполнение совершенно нового SELECT
... отдельно от неудачного UPDATE
, который вы пробовали. Я не думаю, что вы можете объединить оба в один запрос.