1. Почему проверка имени через $external_validation? Что мешает просто добавить правило (как в Auth
сделано)?
2. Вообще, лично для меня вторая модель (User_Contacts) не является обязательной. Соответственно вижу два варианта:
* сохраняем первую модель и просим пользователя отредактировать контакты. Даже если он их не сохранит, они опциональны (ну или будем настойчиво их спрашивать, если все же нужны)
* сохраняем первую модель + те поля, которые прошли валидацию. Все, что не прошло из-за ошибок, показываем пользователю. Мне такой вариант нравится больше.
В общем, не паримся с транзакциями, а однозначно зависим только от правильности первой модели (она основная у нас).