aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/transactions.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2006-06-19 22:48:51 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2006-06-19 22:48:51 +0000
commit15aa6e05528019fbf62e1a5cbd2398a2205af8bb (patch)
tree6cdedee3b5f3ef0a075e55c85e3bc4607c43a3e0 /activerecord/lib/active_record/transactions.rb
parente5fc5aaffe0d97b73678d7edfcaca222f01aba69 (diff)
downloadrails-15aa6e05528019fbf62e1a5cbd2398a2205af8bb.tar.gz
rails-15aa6e05528019fbf62e1a5cbd2398a2205af8bb.tar.bz2
rails-15aa6e05528019fbf62e1a5cbd2398a2205af8bb.zip
r4644@asus: jeremy | 2006-06-16 14:57:03 -0700
locking r4645@asus: jeremy | 2006-06-17 12:41:30 -0700 missing reply fixture r4646@asus: jeremy | 2006-06-19 13:05:23 -0700 Use a per-thread (rather than global) transaction mutex so you may execute concurrent transactions on separate connections. r4647@asus: jeremy | 2006-06-19 13:07:23 -0700 PostgreSQL: introduce allow_concurrency option which determines whether to use blocking or asynchronous #execute. Adapters with blocking #execute will deadlock Ruby threads. The default value is ActiveRecord::Base.allow_concurrency. r4648@asus: jeremy | 2006-06-19 13:08:40 -0700 Pass the default allow_concurrency when instantiating new connections. r4649@asus: jeremy | 2006-06-19 13:11:12 -0700 Break out concurrent transaction tests and run them for PostgreSQLAdapter only (need to fork or system('some_test_script') for the other adapters) r4650@asus: jeremy | 2006-06-19 13:42:48 -0700 Row locking. Provide a locking clause with the :lock finder option or true for the default "FOR UPDATE". r4661@asus: jeremy | 2006-06-19 15:36:51 -0700 excise the junk mutex git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4460 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/transactions.rb')
-rw-r--r--activerecord/lib/active_record/transactions.rb31
1 files changed, 14 insertions, 17 deletions
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index c222e18097..5e82fd2d8e 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -4,8 +4,6 @@ require 'thread'
module ActiveRecord
module Transactions # :nodoc:
- TRANSACTION_MUTEX = Mutex.new
-
class TransactionError < ActiveRecordError # :nodoc:
end
@@ -79,8 +77,8 @@ module ActiveRecord
module ClassMethods
def transaction(*objects, &block)
previous_handler = trap('TERM') { raise TransactionError, "Transaction aborted" }
- lock_mutex
-
+ increment_open_transactions
+
begin
objects.each { |o| o.extend(Transaction::Simple) }
objects.each { |o| o.start_transaction }
@@ -93,22 +91,21 @@ module ActiveRecord
objects.each { |o| o.abort_transaction }
raise
ensure
- unlock_mutex
+ decrement_open_transactions
trap('TERM', previous_handler)
end
end
-
- def lock_mutex#:nodoc:
- Thread.current['open_transactions'] ||= 0
- TRANSACTION_MUTEX.lock if Thread.current['open_transactions'] == 0
- Thread.current['start_db_transaction'] = (Thread.current['open_transactions'] == 0)
- Thread.current['open_transactions'] += 1
- end
-
- def unlock_mutex#:nodoc:
- Thread.current['open_transactions'] -= 1
- TRANSACTION_MUTEX.unlock if Thread.current['open_transactions'] == 0
- 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(*objects, &block)