Transactions are just not working

You need to use the .save! method which throws an exception, or generate your own exception if there's an error. Transactions only roll back on an exception.

Yes.

That is a given when wrapped in a transaction.