トランザクションの分離レベル

railsに置いてトランザクションを実行するにあたって、分離レベルの設定方法がわからなくて調べてみた。ソースを追ってみると、どうも各DBMSのアダプタ実装に依存するようだ。

# ./rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:262:
class MysqlAdapter < AbstractAdapter
      ...
      def begin_db_transaction #:nodoc:
        execute "BEGIN"
      rescue Exception
        # Transactions aren't supported
      end
      ...
end

このように、begin_db_transactionメソッドにて、"BIGIN"が実行されているだけなので、mysql(InnoDB)のデフォルト分離レベルである"REPEATABLE READ"が適用される。

因みに、postgresql_adapter.rbにもmysql_adapter.rbと同様に

execute "BEGIN"

となっているが、postgresqlのデフォルト分離レベルは"READ COMMITTED"なので、やはりadapterの実装(利用するDBMS)によって利用する分離レベルに注意する必要がありそうだ。

で、分離レベルをトランザクション毎に変更したいような場合はどうすればよいのか?というのは後日調べるとする。