class ConcurrentTransactionTest

Public Instance Methods

test_transaction_isolation__read_committed() click to toggle source

Test for dirty reads among simultaneous transactions.

# File activerecord/test/cases/transactions_test.rb, line 981
def test_transaction_isolation__read_committed
  # Should be invariant.
  original_salary = Developer.find(1).salary
  temporary_salary = 200000

  assert_nothing_raised do
    threads = (1..3).map do
      Thread.new do
        Developer.transaction do
          # Expect original salary.
          dev = Developer.find(1)
          assert_equal original_salary, dev.salary

          dev.salary = temporary_salary
          dev.save!

          # Expect temporary salary.
          dev = Developer.find(1)
          assert_equal temporary_salary, dev.salary

          dev.salary = original_salary
          dev.save!

          # Expect original salary.
          dev = Developer.find(1)
          assert_equal original_salary, dev.salary
        end
        Developer.connection.close
      end
    end

    # Keep our eyes peeled.
    threads << Thread.new do
      10.times do
        sleep 0.05
        Developer.transaction do
          # Always expect original salary.
          assert_equal original_salary, Developer.find(1).salary
        end
      end
      Developer.connection.close
    end

    threads.each(&:join)
  end

  assert_equal original_salary, Developer.find(1).salary
end
test_transaction_per_thread() click to toggle source
# File activerecord/test/cases/transactions_test.rb, line 962
def test_transaction_per_thread
  threads = 3.times.map do
    Thread.new do
      Topic.transaction do
        topic = Topic.find(1)
        topic.approved = !topic.approved?
        assert topic.save!
        topic.approved = !topic.approved?
        assert topic.save!
      end
      Topic.connection.close
    end
  end

  threads.each(&:join)
end