##!の有無の違いは?
create!
、save!
→ レコードの作成・保存に失敗 → 例外を発生させる
create
、save
→ レコードの作成・保存に失敗 → nilを返す
##なぜ、例外を発生させる?
RailsのTransactionにおいて、ロールバックが発火するには「例外」が必要であるから。
例えば、Railsでは #update_attributeは例外を発火せずに、falseに返すとなる。そのため、#update_attributeを使うには、結果を見て、例外をスローする必要がある。Railsではびっくりマーク!がついているメソッドは、失敗したら例外をスローすると意図するので、transactionを使うときは、saveではなくsave!、destroyではなくdestroy!を使うべきでしょう。
参考記事
RailsのTransactionの使い方:https://qiita.com/huydx/items/d946970d130b7dabe7ec
Railsで感嘆符!を理解しよう(save, save!):https://qiita.com/ozin/items/5968971c9d2b3ab0a84d