<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -118,6 +118,19 @@ module ActiveRecord
         @connection
       end
 
+      def open_transactions
+        @open_transactions ||= 0
+      end
+
+      def increment_open_transactions
+        @open_transactions ||= 0
+        @open_transactions += 1
+      end
+
+      def decrement_open_transactions
+        @open_transactions -= 1
+      end
+
       def log_info(sql, name, runtime)
         if @logger &amp;&amp; @logger.debug?
           name = &quot;#{name.nil? ? &quot;SQL&quot; : name} (#{sprintf(&quot;%f&quot;, runtime)})&quot;</diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -515,7 +515,7 @@ class Fixtures &lt; (RUBY_VERSION &lt; '1.9' ? YAML::Omap : Hash)
 
           all_loaded_fixtures.update(fixtures_map)
 
-          connection.transaction(Thread.current['open_transactions'].to_i == 0) do
+          connection.transaction(connection.open_transactions.zero?) do
             fixtures.reverse.each { |fixture| fixture.delete_existing_fixtures }
             fixtures.each { |fixture| fixture.insert_fixtures }
 
@@ -930,7 +930,7 @@ module Test #:nodoc:
             load_fixtures
             @@already_loaded_fixtures[self.class] = @loaded_fixtures
           end
-          ActiveRecord::Base.send :increment_open_transactions
+          ActiveRecord::Base.connection.increment_open_transactions
           ActiveRecord::Base.connection.begin_db_transaction
         # Load fixtures for every test.
         else
@@ -951,9 +951,9 @@ module Test #:nodoc:
         end
 
         # Rollback changes if a transaction is active.
-        if use_transactional_fixtures? &amp;&amp; Thread.current['open_transactions'] != 0
+        if use_transactional_fixtures? &amp;&amp; ActiveRecord::Base.connection.open_transactions != 0
           ActiveRecord::Base.connection.rollback_db_transaction
-          Thread.current['open_transactions'] = 0
+          ActiveRecord::Base.connection.decrement_open_transactions
         end
         ActiveRecord::Base.verify_active_connections!
       end</diff>
      <filename>activerecord/lib/active_record/fixtures.rb</filename>
    </modified>
    <modified>
      <diff>@@ -73,25 +73,14 @@ module ActiveRecord
     # trigger a ROLLBACK when raised, but not be re-raised by the transaction block.
     module ClassMethods
       def transaction(&amp;block)
-        increment_open_transactions
+        connection.increment_open_transactions
 
         begin
-          connection.transaction(Thread.current['start_db_transaction'], &amp;block)
+          connection.transaction(connection.open_transactions == 1, &amp;block)
         ensure
-          decrement_open_transactions
+          connection.decrement_open_transactions
         end
       end
-
-      private
-        def increment_open_transactions #:nodoc:
-          open = Thread.current['open_transactions'] ||= 0
-          Thread.current['start_db_transaction'] = open.zero?
-          Thread.current['open_transactions'] = open + 1
-        end
-
-        def decrement_open_transactions #:nodoc:
-          Thread.current['open_transactions'] -= 1
-        end
     end
 
     def transaction(&amp;block)</diff>
      <filename>activerecord/lib/active_record/transactions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -461,11 +461,11 @@ class FixturesBrokenRollbackTest &lt; ActiveRecord::TestCase
   alias_method :teardown, :blank_teardown
 
   def test_no_rollback_in_teardown_unless_transaction_active
-    assert_equal 0, Thread.current['open_transactions']
+    assert_equal 0, ActiveRecord::Base.connection.open_transactions
     assert_raise(RuntimeError) { ar_setup_fixtures }
-    assert_equal 0, Thread.current['open_transactions']
+    assert_equal 0, ActiveRecord::Base.connection.open_transactions
     assert_nothing_raised { ar_teardown_fixtures }
-    assert_equal 0, Thread.current['open_transactions']
+    assert_equal 0, ActiveRecord::Base.connection.open_transactions
   end
 
   private</diff>
      <filename>activerecord/test/cases/fixtures_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -57,4 +57,29 @@ class MultipleDbTest &lt; ActiveRecord::TestCase
 
     assert Course.connection
   end
+
+  def test_transactions_across_databases
+    c1 = Course.find(1)
+    e1 = Entrant.find(1)
+
+    begin
+      Course.transaction do
+        Entrant.transaction do
+          c1.name = &quot;Typo&quot;
+          e1.name = &quot;Typo&quot;
+          c1.save
+          e1.save
+          raise &quot;No I messed up.&quot;
+        end
+      end
+    rescue
+      # Yup caught it
+    end
+
+    assert_equal &quot;Typo&quot;, c1.name
+    assert_equal &quot;Typo&quot;, e1.name
+
+    assert_equal &quot;Ruby Development&quot;, Course.find(1).name
+    assert_equal &quot;Ruby Developer&quot;, Entrant.find(1).name
+  end
 end</diff>
      <filename>activerecord/test/cases/multiple_db_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>24a8ae4e08fcd15a8c3792990d1d0981d004d339</id>
    </parent>
  </parents>
  <author>
    <name>Jonathan Viney</name>
    <email>jonathan.viney@gmail.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/4f72feb84c25b54f66c7192c788b7fd965f2d493</url>
  <id>4f72feb84c25b54f66c7192c788b7fd965f2d493</id>
  <committed-date>2008-07-15T12:25:12-07:00</committed-date>
  <authored-date>2008-07-01T21:01:26-07:00</authored-date>
  <message>Move the transaction counter to the connection object rather than maintaining it on the current Thread.

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;
[#533 state:resolved]</message>
  <tree>caa8cf9cb15c786dc627e438122da822986d8f6e</tree>
  <committer>
    <name>Michael Koziarski</name>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
