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
6 def freeze
7   supports_savepoints?
8   super
9 end
supports_savepoints?() click to toggle source

Check the JDBC DatabaseMetaData for savepoint support

   # File lib/sequel/adapters/jdbc/transactions.rb
12 def supports_savepoints?
13   return @supports_savepoints if defined?(@supports_savepoints)
14   @supports_savepoints = synchronize{|c| c.getMetaData.supports_savepoints}
15 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
19 def supports_transaction_isolation_levels?
20   synchronize{|conn| conn.getMetaData.supportsTransactionIsolationLevel(JavaSQL::Connection::TRANSACTION_SERIALIZABLE)}
21 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
47 def begin_transaction(conn, opts=OPTS)
48   if supports_savepoints?
49     th = _trans(conn)
50     if sps = th[:savepoint_objs]
51       sps << log_connection_yield('Transaction.savepoint', conn){conn.set_savepoint}
52     else
53       log_connection_yield('Transaction.begin', conn){conn.setAutoCommit(false)}
54       th[:savepoint_objs] = []
55       set_transaction_isolation(conn, opts)
56     end
57   else
58     log_connection_yield('Transaction.begin', conn){conn.setAutoCommit(false)}
59     set_transaction_isolation(conn, opts)
60   end
61 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
64 def commit_transaction(conn, opts=OPTS)
65   if supports_savepoints?
66     sps = _trans(conn)[:savepoint_objs]
67     if sps.empty?
68       log_connection_yield('Transaction.commit', conn){conn.commit}
69     elsif supports_releasing_savepoints?
70       log_connection_yield('Transaction.release_savepoint', conn){supports_releasing_savepoints? ? conn.release_savepoint(sps.last) : sps.last}
71     end
72   else
73     log_connection_yield('Transaction.commit', conn){conn.commit}
74   end
75 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
78 def remove_transaction(conn, committed)
79   if jdbc_level = _trans(conn)[:original_jdbc_isolation_level]
80     conn.setTransactionIsolation(jdbc_level)
81   end
82   if supports_savepoints?
83     sps = _trans(conn)[:savepoint_objs]
84     conn.setAutoCommit(true) if sps.empty?
85     sps.pop
86   else
87     conn.setAutoCommit(true)
88   end
89 ensure
90   super
91 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
 94 def rollback_transaction(conn, opts=OPTS)
 95   if supports_savepoints?
 96     sps = _trans(conn)[:savepoint_objs]
 97     if sps.empty?
 98       log_connection_yield('Transaction.rollback', conn){conn.rollback}
 99     else
100       log_connection_yield('Transaction.rollback_savepoint', conn){conn.rollback(sps.last)}
101     end
102   else
103     log_connection_yield('Transaction.rollback', conn){conn.rollback}
104   end
105 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
32 def set_transaction_isolation(conn, opts)
33   level = opts.fetch(:isolation, transaction_isolation_level)
34   if (jdbc_level = JDBC_TRANSACTION_ISOLATION_LEVELS[level]) &&
35       conn.getMetaData.supportsTransactionIsolationLevel(jdbc_level)
36     _trans(conn)[:original_jdbc_isolation_level] = conn.getTransactionIsolation
37     log_connection_yield("Transaction.isolation_level = #{level}", conn){conn.setTransactionIsolation(jdbc_level)}
38   end
39 end
supports_releasing_savepoints?() click to toggle source

Most JDBC drivers that support savepoints support releasing them.

   # File lib/sequel/adapters/jdbc/transactions.rb
42 def supports_releasing_savepoints?
43   true
44 end