Class: ActiveRecord::DeadlockRetry

Inherits:
Object
  • Object
show all
Defined in:
lib/activerecord/deadlock_retry.rb

Constant Summary collapse

LOG_DIR =
'log'

Class Method Summary collapse

Class Method Details

.loggerObject



22
23
24
25
26
27
28
29
30
# File 'lib/activerecord/deadlock_retry.rb', line 22

def self.logger
  return @logger if @logger
  if defined?(Rails)
    @logger = Rails.logger
  else
    Dir.mkdir(LOG_DIR) unless Dir.exist?(LOG_DIR)
    @logger = Logger.new(File.join(LOG_DIR, 'deadlock_retry.log'))
  end
end

.logger=(logger) ⇒ Object



32
33
34
# File 'lib/activerecord/deadlock_retry.rb', line 32

def self.logger=(logger)
  @logger = logger
end

.transaction(opts = {}, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/activerecord/deadlock_retry.rb', line 5

def self.transaction(opts={}, &block)
  klass   = opts[:class]   || ActiveRecord::Base
  method  = opts[:method]  || :transaction
  retries = opts[:retries] || 5
  begin
    klass.send(method, &block)
  rescue ActiveRecord::StatementInvalid => e
    if e.message =~ /Deadlock found when trying to get lock/ && retries > 0
      retries -= 1
      logger.info("ActiveRecord::DeadlockRetry: retrying transaction after deadlock (#{retries} retries left)")
      sleep 5
      retry
    end
    raise
  end
end