Я думаю это принципиально разные транзакции. Чуть-чуть модифицируем ваш эксперимент. Сделаем так. В первом клиенте изменим поле code1 и не выходим их этого поля. Во втором клиенте изменяем поле Decimal1, переходим на другую запись тем самым, сохраняя изменения. Переключаемся на первого клиента и переходим из поля code1 только не на другую запись, а в другое поле данной записи например в тоже decimal1. Что получилось: изменения сделаны – сделаны. Программа запускает Validate поля code1, начинается транзакция, что-то она делает и благополучно заканчивается, внося изменения в другую табличку (Test Commit). О том, что данная запись была изменена в другом клиенте пока ничего не известно. Теперь из поля decimal1 переходим на другую запись и система ругается, что данная запись была изменена другим пользователем. Затем она изменяют эту запись на основе новых данных (полученных/измененных во втором клиенте). Таким образом создается впечатление, что произошел откат транзакции (поле code1 примет старое значение).
Вообщем, думаю - это такие тонкости, которые желательно знать.