module Sequel::JDBC::Transactions

Constants

JDBC_TRANSACTION_ISOLATION_LEVELS
TRANSACTION_BEGIN
TRANSACTION_COMMIT
TRANSACTION_RELEASE_SP
TRANSACTION_ROLLBACK
TRANSACTION_ROLLBACK_SP
TRANSACTION_SAVEPOINT

Public Instance Methods

freeze() click to toggle source
Calls superclass method
# File lib/sequel/adapters/jdbc/transactions.rb, line 13
def freeze
  supports_savepoints?
  super
end
supports_savepoints?() click to toggle source

Check the JDBC DatabaseMetaData for savepoint support

# File lib/sequel/adapters/jdbc/transactions.rb, line 19
def supports_savepoints?
  return @supports_savepoints if defined?(@supports_savepoints)
  @supports_savepoints = synchronize{|c| c.getMetaData.supports_savepoints}
end
supports_transaction_isolation_levels?() click to toggle source

Check the JDBC DatabaseMetaData for support for serializable isolation, since that's the value most people will use.

# File lib/sequel/adapters/jdbc/transactions.rb, line 26
def supports_transaction_isolation_levels?
  synchronize{|conn| conn.getMetaData.supportsTransactionIsolationLevel(JavaSQL::Connection::TRANSACTION_SERIALIZABLE)}
end

Private Instance Methods

begin_transaction(conn, opts=OPTS) click to toggle source

Use JDBC connection's setAutoCommit to false to start transactions

# File lib/sequel/adapters/jdbc/transactions.rb, line 54
def begin_transaction(conn, opts=OPTS)
  if supports_savepoints?
    th = _trans(conn)
    if sps = th[:savepoint_objs]
      sps << log_connection_yield(TRANSACTION_SAVEPOINT, conn){conn.set_savepoint}
    else
      log_connection_yield(TRANSACTION_BEGIN, conn){conn.setAutoCommit(false)}
      th[:savepoint_objs] = []
      set_transaction_isolation(conn, opts)
    end
  else
    log_connection_yield(TRANSACTION_BEGIN, conn){conn.setAutoCommit(false)}
    set_transaction_isolation(conn, opts)
  end
end
commit_transaction(conn, opts=OPTS) click to toggle source

Use JDBC connection's commit method to commit transactions

# File lib/sequel/adapters/jdbc/transactions.rb, line 71
def commit_transaction(conn, opts=OPTS)
  if supports_savepoints?
    sps = _trans(conn)[:savepoint_objs]
    if sps.empty?
      log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
    elsif supports_releasing_savepoints?
      log_connection_yield(TRANSACTION_RELEASE_SP, conn){supports_releasing_savepoints? ? conn.release_savepoint(sps.last) : sps.last}
    end
  else
    log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
  end
end
remove_transaction(conn, committed) click to toggle source

Use JDBC connection's setAutoCommit to true to enable non-transactional behavior

Calls superclass method
# File lib/sequel/adapters/jdbc/transactions.rb, line 85
def remove_transaction(conn, committed)
  if jdbc_level = _trans(conn)[:original_jdbc_isolation_level]
    conn.setTransactionIsolation(jdbc_level)
  end
  if supports_savepoints?
    sps = _trans(conn)[:savepoint_objs]
    conn.setAutoCommit(true) if sps.empty?
    sps.pop
  else
    conn.setAutoCommit(true)
  end
ensure
  super
end
rollback_transaction(conn, opts=OPTS) click to toggle source

Use JDBC connection's rollback method to rollback transactions

# File lib/sequel/adapters/jdbc/transactions.rb, line 101
def rollback_transaction(conn, opts=OPTS)
  if supports_savepoints?
    sps = _trans(conn)[:savepoint_objs]
    if sps.empty?
      log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback}
    else
      log_connection_yield(TRANSACTION_ROLLBACK_SP, conn){conn.rollback(sps.last)}
    end
  else
    log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback}
  end
end
set_transaction_isolation(conn, opts) click to toggle source

Set the transaction isolation level on the given connection using the JDBC API.

# File lib/sequel/adapters/jdbc/transactions.rb, line 39
def set_transaction_isolation(conn, opts)
  level = opts.fetch(:isolation, transaction_isolation_level)
  if (jdbc_level = JDBC_TRANSACTION_ISOLATION_LEVELS[level]) &&
      conn.getMetaData.supportsTransactionIsolationLevel(jdbc_level)
    _trans(conn)[:original_jdbc_isolation_level] = conn.getTransactionIsolation
    log_connection_yield("Transaction.isolation_level = #{level}", conn){conn.setTransactionIsolation(jdbc_level)}
  end
end
supports_releasing_savepoints?() click to toggle source

Most JDBC drivers that support savepoints support releasing them.

# File lib/sequel/adapters/jdbc/transactions.rb, line 49
def supports_releasing_savepoints?
  true
end