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