module Sequel::JDBC::Transactions

Constants

JDBC_TRANSACTION_ISOLATION_LEVELS

Public Instance Methods

freeze() click to toggle source
Calls superclass method
# File lib/sequel/adapters/jdbc/transactions.rb, line 6
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 12
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 19
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 52
def begin_transaction(conn, opts=OPTS)
  if in_savepoint?(conn)
    _trans(conn)[:savepoints][-1][:obj] = log_connection_yield('Transaction.savepoint', conn){conn.set_savepoint}
  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 62
def commit_transaction(conn, opts=OPTS)
  if in_savepoint?(conn)
    if supports_releasing_savepoints?
      log_connection_yield('Transaction.release_savepoint', conn){conn.release_savepoint(savepoint_obj(conn))}
    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 73
def remove_transaction(conn, committed)
  if jdbc_level = _trans(conn)[:original_jdbc_isolation_level]
    log_connection_yield("Transaction.restore_isolation_level", conn){conn.setTransactionIsolation(jdbc_level)}
  end
  unless in_savepoint?(conn)
    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 85
def rollback_transaction(conn, opts=OPTS)
  if in_savepoint?(conn)
    log_connection_yield('Transaction.rollback_savepoint', conn){conn.rollback(savepoint_obj(conn))}
  else
    log_connection_yield('Transaction.rollback', conn){conn.rollback}
  end
end
savepoint_obj(conn) click to toggle source

JDBC savepoint object for the current savepoint for the connection.

# File lib/sequel/adapters/jdbc/transactions.rb, line 47
def savepoint_obj(conn)
  _trans(conn)[:savepoints][-1][:obj]
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 32
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 42
def supports_releasing_savepoints?
  true
end