トランザクション分離レベルのカスタマイズ
READ COMMITTED は、Microsoft SQL Server データベース エンジンの既定の分離レベルです。アプリケーションを異なる分離レベルで動作させる必要がある場合、次の方法を使用して分離レベルを設定できます。
SET TRANSACTION ISOLATION LEVEL ステートメントを実行します。
System.Data.SqlClient マネージ名前空間を使用している ADO.NET アプリケーションでは、SqlConnection.BeginTransaction メソッドを使用して IsolationLevel オプションを指定できます。
ADO を使用するアプリケーションでは、Autocommit Isolation Levels プロパティを設定できます。
トランザクションを開始するとき、OLE DB を使用しているアプリケーションでは、isoLevel を必要なトランザクション分離レベルに設定して ITransactionLocal::StartTransaction を呼び出すことができます。OLE DB を使用するアプリケーションでは、自動コミット モードの分離レベルを指定するときに、DBPROPSET_SESSION プロパティの DBPROP_SESS_AUTOCOMMITISOLEVELS を必要なトランザクション分離レベルに設定できます。
ODBC を使用するアプリケーションでは、SQLSetConnectAttr を使用して SQL_COPT_SS_TXN_ISOLATION 属性を設定できます。
トランザクション分離レベルの設定の詳細については、「トランザクション分離レベルの調整」を参照してください。
分離レベルを指定すると、SQL Server セッションのクエリおよびデータ操作言語 (DML) ステートメントすべてに対するロック動作は、その分離レベルで動作します。分離レベルは、セッションが終了するか、または分離レベルが別のレベルに設定されるまで有効です。
次の例では、SERIALIZABLE 分離レベルを設定します。
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
SELECT BusinessEntityID
FROM HumanResources.Employee;
GO
分離レベルは、必要に応じて個別のクエリまたは DML ステートメントでテーブル レベルのヒントを指定することにより上書きできます。テーブル レベルのヒントを指定しても、セッション内の他のステートメントに影響はありません。テーブル レベルのヒントを使用して既定の動作を変更する操作は、どうしても必要な場合にのみ行うことをお勧めします。
データの読み取り時に共有ロックが要求されない分離レベルを設定した場合でも、データベース エンジンではメタデータの読み取り時にロックの取得が必要になる場合があります。たとえば、トランザクションが READ UNCOMMITTED 分離レベルで実行されている場合、データの読み取り時には共有ロックが取得されませんが、システム カタログ ビューの読み取り時にはロックが要求されることがあります。つまり、READ UNCOMMITTED 分離レベルで実行されているトランザクションでは、同時実行トランザクションでテーブルのメタデータが変更されているときに、そのテーブルに対してクエリが実行されると、ブロッキングを発生させることがあります。
現在設定されているトランザクション分離レベルを特定するには、次の例に示すように、DBCC USEROPTIONS ステートメントを使用します。次に示す結果セットは、使用中のシステムの結果セットとは異なる場合があります。
USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
DBCC USEROPTIONS;
GO
以下に結果セットを示します。
Set Option Value
---------------------------- -------------------------------------------
textsize 2147483647
language us_english
dateformat mdy
datefirst 7
... ...
Isolation level repeatable read
(14 行処理されました)
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。