# 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