File: transactable.rb

package info (click to toggle)
ruby-awesome-nested-set 3.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 172 kB
  • sloc: ruby: 1,044; makefile: 2
file content (34 lines) | stat: -rw-r--r-- 1,160 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module CollectiveIdea #:nodoc:
  module Acts #:nodoc:
    module NestedSet #:nodoc:
      module Model
        module Transactable
          class OpenTransactionsIsNotZero < ActiveRecord::StatementInvalid
          end

          class DeadlockDetected < ActiveRecord::StatementInvalid
          end

          protected
          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 self.class.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

        end
      end
    end
  end
end