You aren't using it right. The transaction hasn't failed, the validation has. You need to check the result of the $user->save() call to see if the validation failed. The validation result is also stored in $object->valid.
Transactions are only used to group a series of queries, just like in normal SQL.