module CQL::ActiveRecord::OptimisticLocking

Overview

Provides optimistic locking functionality for Active Record models. This module allows you to prevent concurrent updates from overwriting each other by using a version column in the database.

Usage

Include this module in your model:

class User < CQL::ActiveRecord::Base
  include CQL::ActiveRecord::OptimisticLocking

  optimistic_locking column_name: :version_number
end

The table should have a version column:

schema.create_table :users do |t|
  t.primary :id, Int64
  t.column :name, String
  t.column :email, String
  t.lock_version :version_number
end

When updating a record, any concurrent updates will be detected:

user = User.find!(1)
# Somebody else updates this record in another process
begin
  user.update!(name: "New Name") # This will fail
rescue CQL::OptimisticLockError
  # Handle concurrent update
  user.reload!                   # Get the latest version
  user.update!(name: "New Name") # Try again
end

Defined in:

active_record/optimistic_locking.cr

Macro Summary

Macro Detail

macro optimistic_locking(version_column = :lock_version) #

Define optimistic locking for a model Specifies optimistic locking settings for the model.

  • @param column_name [Symbol] the name of the version column (default: :version)

Example

class User < CQL::ActiveRecord::Base
  include CQL::ActiveRecord::OptimisticLocking

  optimistic_locking column_name: :version
end

[View source]