Вы не говорите, почему используете оптимистичную блокировку.
Вы обычно используете его, чтобы избежать блокировки ресурсов (например, строк базы данных) в течение длительного времени, то есть данные считываются из базы данных и отображаются пользователю. В конце концов пользователь вносит изменения в базу данных, и данные записываются обратно.
Вы не хотите блокировать данные для других пользователей за это время. В подобном сценарии вы не хотите использовать вариант 2 по той же причине.
Вариант 1 нелегкий, поскольку исключение с оптимистичной блокировкой говорит вам, что что-то изменило данные за вашей спиной, и вы заменили эти изменения своими данными. Повторная попытка записи данных здесь не поможет.
Вариант 3 может быть возможен в некоторых ситуациях, но добавляет много сложности и возможных ошибок. Это было бы моим последним прибежищем.
По моему опыту оптимистичные блокирующие исключения встречаются довольно редко. В большинстве случаев самый простой выход - это отбросить все и повторить его с самого начала, даже если это означает сказать пользователю: извините, возникла неожиданная проблема, сделайте это снова.
С другой стороны, если вы регулярно сталкиваетесь с этими проблемами, между двумя конкурирующими нитями, вы должны попытаться избежать этого. В этих случаях вариант 2 может кстати, но это зависит от сценария.
Если конфликт возникает между взаимодействием пользователя и фоновым потоком (а не между двумя пользователями), вы можете попытаться изменить время фонового потока или указать фоновый поток, чтобы задержать его работу.
Подводя итог: это в основном зависит от вашей установки и того, когда и как происходит исключение.
Это не так просто. Это полностью зависит от того, что вы делаете. – Kayaman