Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #5457: nested_transactions.rb

File nested_transactions.rb, 1.5 kB (added by airbaggins, 2 years ago)

Alternative method.

Line 
1 class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
2   alias begin_db_transaction_unnested begin_db_transaction
3   alias commit_db_transaction_unnested commit_db_transaction
4   alias rollback_db_transaction_unnested rollback_db_transaction
5
6   def begin_db_transaction
7     @nested_transaction_count ||= 0
8     if @nested_transaction_count > 0
9       #puts "starting savepoint #{@nested_transaction_count}"
10       execute "SAVEPOINT rails_nested_transaction_#{@nested_transaction_count}"
11       @nested_transaction_count += 1
12     else
13       #puts "starting transaction #{@nested_transaction_count}"
14       begin_db_transaction_unnested
15       @nested_transaction_count = 1
16     end
17   end
18
19   def commit_db_transaction
20     if @nested_transaction_count > 1
21       @nested_transaction_count -= 1
22       #puts "releasing savepoint #{@nested_transaction_count}"
23       execute "RELEASE SAVEPOINT rails_nested_transaction_#{@nested_transaction_count}"
24     else
25       @nested_transaction_count = 0
26       #puts "committing transaction #{@nested_transaction_count}"
27       commit_db_transaction_unnested
28     end
29   end
30
31   def rollback_db_transaction
32     if @nested_transaction_count > 1
33       @nested_transaction_count -= 1
34       #puts "rolling back to savepoint #{@nested_transaction_count}"
35       execute "ROLLBACK TO SAVEPOINT rails_nested_transaction_#{@nested_transaction_count}"
36     else
37       @nested_transaction_count = 0
38       #puts "rolling back transaction #{@nested_transaction_count}"
39       rollback_db_transaction_unnested
40     end
41   end
42
43 end