aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-05-13 11:03:37 +0900
committerGitHub <noreply@github.com>2018-05-13 11:03:37 +0900
commit8cfa34626c56b1e52328194e380d661785a7b082 (patch)
tree81a4bf283699f0f554087d0dace530a9052bfdbc /activerecord
parent6fac9bd599eeb6b9cacdf7841811223402c501bd (diff)
parent2f29380c18d7754cefffbc09bebaa2007fb99929 (diff)
downloadrails-8cfa34626c56b1e52328194e380d661785a7b082.tar.gz
rails-8cfa34626c56b1e52328194e380d661785a7b082.tar.bz2
rails-8cfa34626c56b1e52328194e380d661785a7b082.zip
Merge pull request #32862 from eugeneius/callback_rollback
Don't clear transaction state after manual rollback
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/transactions.rb8
-rw-r--r--activerecord/test/cases/transactions_test.rb12
2 files changed, 13 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index be4f41050e..6e9dff5796 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -382,13 +382,7 @@ module ActiveRecord
status = nil
self.class.transaction do
add_to_transaction
- begin
- status = yield
- rescue ActiveRecord::Rollback
- clear_transaction_record_state
- status = nil
- end
-
+ status = yield
raise ActiveRecord::Rollback unless status
end
status
diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb
index 3fd38b4b60..931e01845a 100644
--- a/activerecord/test/cases/transactions_test.rb
+++ b/activerecord/test/cases/transactions_test.rb
@@ -292,6 +292,18 @@ class TransactionTest < ActiveRecord::TestCase
assert_nil new_topic.id, "The topic should not have an ID"
end
+ def test_callback_rollback_in_create_with_rollback_exception
+ topic = Class.new(Topic) {
+ def after_create_for_transaction
+ raise ActiveRecord::Rollback
+ end
+ }
+
+ new_topic = topic.create(title: "A new topic")
+ assert !new_topic.persisted?, "The topic should not be persisted"
+ assert_nil new_topic.id, "The topic should not have an ID"
+ end
+
def test_nested_explicit_transactions
Topic.transaction do
Topic.transaction do