Rails + MySQLでトランザクションを実現したいのですが、
どうにも上手くいきません。

例えば以下のような場合、

BookモデルとAuthorモデルがあって、
BookをDBに登録した後にAuthorをDBに登録したいが
両方登録できた時のみ成功させたいのでトランザクションにする。

Book.transaction do

@book = Book.new(:title => 'RoRの本')
@book.save!
@author = Author.new(:name => 'aaa')
@author.save!
@book.author = @author

end

こんな感じのコードを書いているのですが、
Author登録前に自分で例外を起こすとBookだけが登録された状態になってしまうのです。
何か考え方に間違っているところはありますでしょうか?