Skip to content

Commit

Permalink
Merge pull request #44690 from nvasilevski/flunk-if-test-isnt-using-s…
Browse files Browse the repository at this point in the history
…avepoint-transaction-mysql2

[mysql2 tests only] Flunk if test is not using SavepointTransaction
  • Loading branch information
tenderlove committed Mar 15, 2022
2 parents eaf0c04 + 2d9164f commit f01fee7
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions activerecord/test/cases/adapters/mysql2/nested_deadlock_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ class Sample < ActiveRecord::Base
begin
thread = Thread.new do
Sample.transaction(requires_new: false) do
make_parent_transaction_dirty
Sample.transaction(requires_new: true) do
assert_current_transaction_is_savepoint_transaction
s1.lock!
barrier.wait
s2.update value: 1
Expand All @@ -54,7 +56,9 @@ class Sample < ActiveRecord::Base

begin
Sample.transaction(requires_new: false) do
make_parent_transaction_dirty
Sample.transaction(requires_new: true) do
assert_current_transaction_is_savepoint_transaction
s2.lock!
barrier.wait
s1.update value: 2
Expand Down Expand Up @@ -83,8 +87,10 @@ class Sample < ActiveRecord::Base

thread = Thread.new do
Sample.transaction(requires_new: false) do
make_parent_transaction_dirty
begin
Sample.transaction(requires_new: true) do
assert_current_transaction_is_savepoint_transaction
s1.lock!
barrier.wait
s2.update value: 4
Expand All @@ -98,8 +104,10 @@ class Sample < ActiveRecord::Base

begin
Sample.transaction(requires_new: false) do
make_parent_transaction_dirty
begin
Sample.transaction(requires_new: true) do
assert_current_transaction_is_savepoint_transaction
s2.lock!
barrier.wait
s1.update value: 3
Expand All @@ -115,5 +123,18 @@ class Sample < ActiveRecord::Base
assert_equal 1, deadlocks
assert_equal [10, 10], Sample.pluck(:value)
end

private
# This should cause the next nested transaction to be a savepoint transaction.
def make_parent_transaction_dirty
Sample.take
end

def assert_current_transaction_is_savepoint_transaction
current_transaction = Sample.connection.current_transaction
unless current_transaction.is_a?(ActiveRecord::ConnectionAdapters::SavepointTransaction)
flunk("current transaction is not a savepoint transaction")
end
end
end
end

0 comments on commit f01fee7

Please sign in to comment.