Sha256: 39fb527d12222398e6d5911e662ede3ff5a28fbd698196ebc3367935037ad31a

Contents?: true

Size: 1.65 KB

Versions: 5

Compression:

Stored size: 1.65 KB

Contents

# frozen_string_literal: true

module PgEventstore
  # @!visibility private
  class TransactionQueries
    ISOLATION_LEVELS = {
      read_committed: 'READ COMMITTED',
      repeatable_read: 'REPEATABLE READ',
      serializable: 'SERIALIZABLE'
    }.tap do |h|
      h.default = h[:serializable]
    end.freeze

    attr_reader :connection
    private :connection

    # @param connection [PgEventstore::Connection]
    def initialize(connection)
      @connection = connection
    end

    # @param level [Symbol] transaction isolation level
    # @return [void]
    def transaction(level = :serializable)
      connection.with do |conn|
        # We are inside a transaction already - no need to start another one
        if [PG::PQTRANS_ACTIVE, PG::PQTRANS_INTRANS].include?(conn.transaction_status)
          next yield
        end

        pg_transaction(ISOLATION_LEVELS[level], conn) do
          yield
        end
      end
    end

    private

    # @param level [String] PostgreSQL transaction isolation level
    # @param pg_connection [PG::Connection]
    # @return [void]
    def pg_transaction(level, pg_connection)
      pg_connection.transaction do
        pg_connection.exec("SET TRANSACTION ISOLATION LEVEL #{level}")
        yield
      end
    rescue PG::TRSerializationFailure, PG::TRDeadlockDetected
      retry
    rescue MissingPartitions => error
      error.event_types.each do |event_type|
        transaction do
          partition_queries.create_partitions(error.stream, event_type)
        end
      rescue PG::UniqueViolation
        retry
      end
      retry
    end

    def partition_queries
      PartitionQueries.new(connection)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
pg_eventstore-1.1.3 lib/pg_eventstore/queries/transaction_queries.rb
pg_eventstore-1.1.2 lib/pg_eventstore/queries/transaction_queries.rb
pg_eventstore-1.1.1 lib/pg_eventstore/queries/transaction_queries.rb
pg_eventstore-1.1.0 lib/pg_eventstore/queries/transaction_queries.rb
pg_eventstore-1.0.4 lib/pg_eventstore/queries/transaction_queries.rb