aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/transactions.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-04-10 17:49:42 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-04-12 09:19:03 +0900
commit9252da96597fbffe2246704556524c4804239552 (patch)
tree29efc8db177ce019f4bcbac90f5d6667f54226d7 /activerecord/lib/active_record/transactions.rb
parentfaf07d1468af06bb3f7f5dd0776d77dd252af3b6 (diff)
downloadrails-9252da96597fbffe2246704556524c4804239552.tar.gz
rails-9252da96597fbffe2246704556524c4804239552.tar.bz2
rails-9252da96597fbffe2246704556524c4804239552.zip
Don't call after_commit callbacks despite a record isn't saved
Regardless of a record isn't saved (e.g. validation is failed), `after_commit` / `after_rollback` callbacks are invoked for now. To fix the issue, this adds a record to the current transaction only when a record is actually saved. Fixes #29747. Closes #29833.
Diffstat (limited to 'activerecord/lib/active_record/transactions.rb')
-rw-r--r--activerecord/lib/active_record/transactions.rb12
1 files changed, 11 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index a45d228298..333f1a5435 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -376,9 +376,19 @@ module ActiveRecord
def with_transaction_returning_status
status = nil
self.class.transaction do
- add_to_transaction
+ unless has_transactional_callbacks?
+ sync_with_transaction_state
+ set_transaction_state(self.class.connection.transaction_state)
+ end
+ remember_transaction_record_state
+
status = yield
raise ActiveRecord::Rollback unless status
+ ensure
+ if has_transactional_callbacks? &&
+ (@_new_record_before_last_commit && !new_record? || _trigger_update_callback || _trigger_destroy_callback)
+ self.class.connection.add_transaction_record(self)
+ end
end
status
end