Module: ActsAsOrderedTree::TenaciousTransaction
- Included in:
- InstanceMethods
- Defined in:
- lib/acts_as_ordered_tree/tenacious_transaction.rb
Constant Summary collapse
- DEADLOCK_MESSAGES =
/Deadlock found when trying to get lock|Lock wait timeout exceeded|deadlock detected/.freeze
- RETRY_COUNT =
10
Instance Method Summary collapse
-
#tenacious_transaction(&block) ⇒ Object
Partially borrowed from awesome_nested_set.
Instance Method Details
#tenacious_transaction(&block) ⇒ Object
Partially borrowed from awesome_nested_set
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/acts_as_ordered_tree/tenacious_transaction.rb', line 7 def tenacious_transaction(&block) #:nodoc: return transaction(&block) if @in_tenacious_transaction @in_tenacious_transaction = true retry_count = 0 begin transaction(&block) rescue ActiveRecord::StatementInvalid => error raise unless self.class.connection.open_transactions.zero? raise unless error. =~ DEADLOCK_MESSAGES raise unless retry_count < RETRY_COUNT retry_count += 1 logger.info "Deadlock detected on retry #{retry_count}, restarting transaction" sleep(rand(retry_count)*0.1) # Aloha protocol retry ensure @in_tenacious_transaction = false end end |