Hack Your Design!

Rails4 でトランザクション分離レベルを設定する

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

MySQLのデフォルトのトランザクション分離レベルは何か?

REPEATABLE READ

This is the default isolation level for InnoDB.

via. 13.3.6 SET TRANSACTION Syntax

ハイ、答えは「REPEATABLE READ」ですネ.

Rails4でトランザクション分離レベルを設定

では次にRailsにおいてトランザクション分離レベルを設定するにはどうしたらよいでしょう? 実はRails3.xとRails4ではトランザクション分離レベルの設定方法は異なっています。

Rails & MySQL: トランザクション分離レベルをグローバルに設定する

(引用ここから)

Rails 3.x 時代までは、

ActiveRecord::Base.connection.
  execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED')
ActiveRecord::Base.transaction do
  # ...
end

のように書かなければなりませんでしたが、Rails 4 でトランザクションごとに分離レベルを指定できるようになりました:

ActiveRecord::Base.transaction(isolation: :read_committed) do
  # ...
end

(引用ここまで)

有効なトランザクション分離レベル

設定可能で有効なisolation:レベルは何でしょう? 下記4つになります。

Valid isolation levels are:

  • :read_uncommitted
  • :read_committed
  • :repeatable_read
  • :serializable

via. Rails 4 - Transaction isolation level

分離レベルとダーティリード、ファジーリード、ファントムリードの関係

分離レベルとダーティリード、ファジーリード、ファントムリードそれぞれの関係性は以下。

  ダーティリード ファジーリード ファントムリード
READ UNCOMMITTED 発生する 発生する 発生する
READ COMMITTED 発生しない 発生する 発生する
REPEATABLE READ 発生しない 発生しない 発生する
SERIALIZABLE 発生しない 発生しない 発生しない

via. トランザクション分離レベルについて極力分かりやすく解説してみた[SQL]

適切なトランザクション分離レベルで適切なトランザクション処理をしましょう!

参考

  • このエントリーをはてなブックマークに追加
comments powered by Disqus