aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/abstract
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2016-03-02 02:23:11 +1030
committerMatthew Draper <matthew@trebex.net>2016-03-02 02:23:11 +1030
commit833b14c8f8cae2f2ad2ea31669380b51e644c7db (patch)
treebab06923ab93aafa53818237788f26db7d44d105 /activerecord/lib/active_record/connection_adapters/abstract
parent664a13e6fb8281107da0da75e7cd91bba1425f76 (diff)
parent9e28f415f5aa52a3179d7cbef2594a0d0c03bcce (diff)
downloadrails-833b14c8f8cae2f2ad2ea31669380b51e644c7db.tar.gz
rails-833b14c8f8cae2f2ad2ea31669380b51e644c7db.tar.bz2
rails-833b14c8f8cae2f2ad2ea31669380b51e644c7db.zip
Merge pull request #22170 from samphilipd/sam/properly_deallocate_prepared_statements_outside_of_transaction
Correctly deallocate prepared statements if we fail inside a transaction
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/transaction.rb14
1 files changed, 13 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
index 6ecdab6eb0..ca795cb1ad 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
@@ -188,7 +188,10 @@ module ActiveRecord
transaction = begin_transaction options
yield
rescue Exception => error
- rollback_transaction if transaction
+ if transaction
+ rollback_transaction
+ after_failure_actions(transaction, error)
+ end
raise
ensure
unless error
@@ -214,7 +217,16 @@ module ActiveRecord
end
private
+
NULL_TRANSACTION = NullTransaction.new
+
+ # Deallocate invalidated prepared statements outside of the transaction
+ def after_failure_actions(transaction, error)
+ return unless transaction.is_a?(RealTransaction)
+ return unless error.is_a?(ActiveRecord::PreparedStatementCacheExpired)
+ @connection.clear_cache!
+ end
+
end
end
end