module CollectiveIdea::Acts::NestedSet::Model::Transactable

Protected Instance Methods

in_tenacious_transaction(&block) click to toggle source
# File lib/awesome_nested_set/model/transactable.rb, line 13
def in_tenacious_transaction(&block)
  retry_count = 0
  begin
    transaction(&block)
  rescue CollectiveIdea::Acts::NestedSet::Move::ImpossibleMove
    raise
  rescue ActiveRecord::StatementInvalid => error
    raise OpenTransactionsIsNotZero.new(error.message) unless connection.open_transactions.zero?
    raise unless error.message =~ /[Dd]eadlock|Lock wait timeout exceeded/
    raise DeadlockDetected.new(error.message) unless retry_count < 10
    retry_count += 1
    logger.info "Deadlock detected on retry #{retry_count}, restarting transaction"
    sleep(rand(retry_count)*0.1) # Aloha protocol
    retry
  end
end