Skip to content

Commit 77c1bb0

Browse files
committed
Merge pull request #147 from ManageIQ/no_retry_on_trans_ops
Handle statements that cannot be retried on a new database connection by not reconnecting.
2 parents 30f6176 + e1955c3 commit 77c1bb0

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,22 @@ def begin_db_transaction
5050
end
5151

5252
def commit_db_transaction
53-
do_execute "COMMIT TRANSACTION"
53+
disable_auto_reconnect { do_execute "COMMIT TRANSACTION" }
5454
end
5555

5656
def rollback_db_transaction
5757
do_execute "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"
5858
end
5959

6060
def create_savepoint
61-
do_execute "SAVE TRANSACTION #{current_savepoint_name}"
61+
disable_auto_reconnect { do_execute "SAVE TRANSACTION #{current_savepoint_name}" }
6262
end
6363

6464
def release_savepoint
6565
end
6666

6767
def rollback_to_savepoint
68-
do_execute "ROLLBACK TRANSACTION #{current_savepoint_name}"
68+
disable_auto_reconnect { do_execute "ROLLBACK TRANSACTION #{current_savepoint_name}" }
6969
end
7070

7171
def add_limit_offset!(sql, options)

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,13 @@ def with_auto_reconnect
536536
end
537537
end
538538

539+
def disable_auto_reconnect
540+
old_auto_connect, self.class.auto_connect = self.class.auto_connect, false
541+
yield
542+
ensure
543+
self.class.auto_connect = old_auto_connect
544+
end
545+
539546
def auto_reconnected?
540547
return false unless auto_connect
541548
@auto_connecting = true

test/cases/connection_test_sqlserver.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,45 @@ def setup
125125
end
126126
end
127127

128+
context 'testing #disable_auto_reconnect' do
129+
should 'when auto reconnect setting is on' do
130+
with_auto_connect(true) do
131+
@connection.send(:disable_auto_reconnect) do
132+
assert !@connection.class.auto_connect
133+
end
134+
assert @connection.class.auto_connect
135+
end
136+
end
137+
138+
should 'when auto reconnect setting is off' do
139+
with_auto_connect(false) do
140+
@connection.send(:disable_auto_reconnect) do
141+
assert !@connection.class.auto_connect
142+
end
143+
assert !@connection.class.auto_connect
144+
end
145+
end
146+
end
147+
148+
should 'not auto reconnect on commit transaction' do
149+
@connection.disconnect!
150+
assert_raise(ActiveRecord::LostConnection) { @connection.commit_db_transaction }
151+
end
152+
153+
should 'gracefully ignore lost connections on rollback transaction' do
154+
@connection.disconnect!
155+
assert_nothing_raised { @connection.rollback_db_transaction }
156+
end
157+
158+
should 'not auto reconnect on create savepoint' do
159+
@connection.disconnect!
160+
assert_raise(ActiveRecord::LostConnection) { @connection.create_savepoint }
161+
end
162+
163+
should 'not auto reconnect on rollback to savepoint ' do
164+
@connection.disconnect!
165+
assert_raise(ActiveRecord::LostConnection) { @connection.rollback_to_savepoint }
166+
end
128167
end
129168

130169
context 'Diagnostics' do

0 commit comments

Comments
 (0)