Как уже отмечалось, использование SELECT ... FOR UPDATE
помогает, так как блокирует строку, пока транзакция не будет зафиксирована (или откатана).
Вам не нужны две машины, чтобы проверить это. Используя два разных сеанса (например, запустив два разных экземпляра SQL * Plus) и выполняя ваши запросы одновременно в определенном порядке в обоих сеансах, вы сможете воспроизвести проблему (ы) параллелизма, если они есть.
В этом случае вы можете запустить:
Session1: SELECT z AS sel_z -- sel_z = 0
Session1: UPDATE z = sel_z + 1
Session2: SELECT z AS sel_z -- (1) sel_z = 0 because Session1 is uncommitted
Session2: UPDATE z = sel_z + 1
Session1: COMMIT
Session2: COMMIT
Session1: SELECT z AS sel_z -- sel_z = 1
Session2: SELECT z AS sel_z -- sel_z = 1
Проблема в (1), Session2 не видит значения, измененные Session1, потому что они не зафиксированы.
Мое предложение - не думать об изменении уровня изоляции TX, а думать о блокировке надлежащих ресурсов.