I can't see how either would persist an invalid record.
What database system and table storage engine are you using?
i.e. it's not MySQL + MyISAM, right? Right?
That shouldn't matter, anyway; AR won't attempt to INSERT if the record is invalid.
Your validations don't have `:on => :update` or similar clauses, do they?
The save! bang-method doesn't add much complexity over plain save:
lib/active_record/attribute_methods/dirty.rb
40: def save!(*)
41- super.tap do
42- @previously_changed = changes
43- @changed_attributes.clear
44- end
45- end
lib/active_record/persistence.rb
121: def save!(*)
122- create_or_update || raise(RecordNotSaved)
123- end
lib/active_record/transactions.rb
274: def save!(*) #:nodoc:
275- with_transaction_returning_status { super }
276- end
lib/active_record/validations.rb
56: def save!(options={})
57- perform_validations(options) ? super : raise(RecordInvalid.new(self))
58- end
— Paul