2011年12月19日月曜日

SQL Serverのデフォルトの分離レベル

はじめに
DBのトランザクションの分離レベルのお話です。
隔離性とも言うみたいです。
トランザクションACID特性の”I”のIsolationの部分ですね!

分離レベルといえば、
”同時に実行されたトランザクションがどれだけ影響を及ぼさないか”
を表しています(°Д°)
『Read Uncommited』、『Read Commited』、『Repeatable Read』、『Serializable』
があります。

たとえば、
Serializable(直列化可能とでも)なら、
同時に実行しても、まるで一直線にトランザクションが並べられたように、
まったく影響を与えません。
でも、これだと負荷がかかるので、
通常、必要としているレベルを設定して、DBへの負担を軽減します。

MySQLのInnoDBの場合
たとえば、MySQLのInnoDBで、
インストール仕立てのデフォルトはRepeatable Readです。
(この調整はmy.cnfの[mysqlId]で、
transaction-isolation = SERIALIZABLE等々として設定できます。)

じつはSQL Serverでは...
今回お話したいのは、SQL Serverのトランザクションの分離レベルのことです。
じつは意外なことに(僕にとってはww)デフォルトではRead Commitedなんです!
(SQL Server2005と2008で確認)

DBCC USEROPTIONS;
を実行してみてください。

isolation lever read committed

と表示されるはずです。

実務でRead Commitedだと、
Read CommitedだとデータのIDを取得するキーテーブルで、
同じIDを発行してしまうことがありえるので注意です!
(更新するか、破棄されるのか分からないのに、更新前の値を読んでしまうことがありえます。)

ちなみに分離レベルの設定は、
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
でできるみたいです。

0 件のコメント:

コメントを投稿