Module: Familia::Connection::TransactionCore
- Defined in:
- lib/familia/connection/transaction_core.rb
Overview
Core transaction logic shared between global and instance transaction methods
This module provides unified transaction handling with configurable fallback behavior when transactions are unavailable due to connection handler constraints. Eliminates code duplication between Operations and Horreum Connection modules.
Class Method Summary collapse
-
.execute_normal_transaction(dbclient_proc) ⇒ MultiResult
Executes a normal Redis transaction using MULTI/EXEC.
-
.execute_transaction(dbclient_proc) {|Redis| ... } ⇒ MultiResult
Executes a transaction with configurable fallback behavior.
-
.handle_transaction_fallback(dbclient_proc, handler_class) ⇒ MultiResult
Handles transaction fallback based on configured transaction mode.
Class Method Details
.execute_normal_transaction(dbclient_proc) ⇒ MultiResult
Executes a normal Redis transaction using MULTI/EXEC
Handles the standard transaction flow including nested transaction detection, proper Fiber-local state management, and cleanup in ensure blocks.
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/familia/connection/transaction_core.rb', line 79 def self.execute_normal_transaction(dbclient_proc) # Check for existing transaction context return yield(Fiber[:familia_transaction]) if Fiber[:familia_transaction] command_return_values = dbclient_proc.call.multi do |conn| Fiber[:familia_transaction] = conn begin yield(conn) ensure Fiber[:familia_transaction] = nil end end # Return same MultiResult format as other methods summary_boolean = command_return_values.all? { |ret| %w[OK 0 1].include?(ret.to_s) } MultiResult.new(summary_boolean, command_return_values) end |
.execute_transaction(dbclient_proc) {|Redis| ... } ⇒ MultiResult
Executes a transaction with configurable fallback behavior
Handles three transaction scenarios based on connection handler capabilities:
- Normal transaction (MULTI/EXEC) when handler supports transactions
- Reentrant transaction when already within a transaction context
- Individual command execution with configurable error/warn/silent modes
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/familia/connection/transaction_core.rb', line 37 def self.execute_transaction(dbclient_proc, &) # First, get the connection to populate the handler class dbclient_proc.call handler_class = Fiber[:familia_connection_handler_class] # Check transaction capability transaction_capability = handler_class&.allows_transaction if transaction_capability == false handle_transaction_fallback(dbclient_proc, handler_class, &) elsif transaction_capability == :reentrant # Already in transaction, just yield the connection yield(Fiber[:familia_transaction]) else # Normal transaction flow (includes nil, true, and other values) execute_normal_transaction(dbclient_proc, &) end end |
.handle_transaction_fallback(dbclient_proc, handler_class) ⇒ MultiResult
Handles transaction fallback based on configured transaction mode
Delegates to OperationCore.handle_fallback for consistent behavior across transaction and pipeline operations.
66 67 68 |
# File 'lib/familia/connection/transaction_core.rb', line 66 def self.handle_transaction_fallback(dbclient_proc, handler_class, &) OperationCore.handle_fallback(:transaction, dbclient_proc, handler_class, &) end |