Resources

Download Source Code

Summary

# Terminal
rails g migration add_unique_index_to_user_email

# db/migrate/20220508030502_add_unique_index_to_user_email.rb
class AddUniqueIndexToUserEmail < ActiveRecord::Migration[7.0]
  def change
    add_index :users, :email, unique: true
  end
end

# models/user.rb
class User < ApplicationRecord
  validates :email, uniqueness: true
end

# jobs/order_place_job.rb
class OrderPlaceJob < ApplicationJob
  queue_as :critical

  def perform(*args)
    # place some order
    if order.placed?
      UserDeductCreditJob.perform_later(user.id, order.id)
    end
  end
end

# Creating Race Conditions
threads = []
2.times do |i|
  threads << Thread.new do
    user = User.new(email: "john.doe@example.com")
    user.save
  end
end
threads.map(&:join)

Locking Records

user = User.first
user.with_lock do
  user.update!(first_name: "jane")
end

user = User.first
user.lock!
user.first_name = 'jane'
user.save!

user = User.lock.first
user.first_name = 'jane'
user.save!

User.transaction do
  order.place
  user.credits -= order.price
  user.save!
end

ActiveRecord::Base.transaction do
  order.place
  user.credits -= order.price
  user.save!
end