2009-08-31 1 views
5

私が読んだ記事:http://www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htmSQL Serverのロック戦略を変更する方法は?これらのような

そして、私が理解から、SQL Serverは非常に悲観的ロック戦略を持ってい 。そしてパフォーマンスを向上させるために、私はRead Committedスナップショットのロックを変更する必要があります。

しかし、私はこれを行う場所を見つけることができません。ロック戦略はどこで変更できますか?

答えて

5

Using Row Versioning-based Isolation Levelsには、ALTERコマンドを使用して設定する例があります。次のように

は、それは、データベースレベルで設定されている:Row Versioning-based Isolation Levels in the Database Engine

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON; 

より良好な出発点は、関連するトピックをカバーして上記文書の親です。

EDIT:以下のコメントにリンクが追加されました。

+0

しかし、どのように現在の分離レベルがわかりますか? この分離レベルは、トランザクションで実行中のクエリ、またはすべてのクエリにのみ適用されますか? – Allrameest

+1

DBCC USEROPTIONSを実行すると、返される項目の1つが「分離レベル」の現在の設定になります。ここにMSDNのリンクがあります:http://msdn.microsoft.com/en-us/library/ms180065あなたの質問の第二の部分についてのaspx –

+0

は、あなたが特に「TRANをBEGIN」文の前に「SETトランザクションの分離レベルのスナップショット」を使用して、それを設定する必要があります、トランザクション内の分離レベルを使用するようにします。したがって、私が理解しているのは、明示的に宣言したトランザクションクエリにのみ影響します。これの例は上記のリンクにあります。これを説明する素晴らしい記事もここで読むことができます:http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm –

1

は、データベースの負荷が増加するとのtempdbへの負荷の多くを追加します。

ロック方法の変更は、クエリのロックヒントを使用するか、ストアドプロシージャまたは接続のISOLATION LEVELを変更することによって行うのが最適です。これは、SET ISOLATION LEVELコマンドを使用するか、.NETで接続オブジェクトの分離レベルを変更して行います。

デフォルトのページレベル(つまり行レベルのロック)以外のレベルでSQL Serverがロックを処理するようにするには、ステートメントレベルでステートメントレベルでWITH(ROWLOCK)ヒントを使用して処理する必要がありますステートメント。

UPDATE YourTable (WITH ROWLOCK) 
    SET Col2 = 3 
WHERE Col1 = 'test' 

あり、このロックレベルを変更するグローバル設定がされていない、とROWLOCKはページ全体が持っているとして、まだページレベルで行われるスナップショット分離レベルの操作と組み合わせて使用​​されている場合にオフコピーしますtempdbデータベースが更新されたら、古いバージョンをtempdbデータベースから削除する必要があります。

+0

、スタックオーバーフロー自体が使用するようだという設定である-1は、SET ISOLATIONレベルを通じて「READ_COMMITTED_SNAPSHOT」を選択することはできません、または.NET接続オブジェクトを使用します。 Ahmad Mageedの答えのように、データベースを変更する必要があります。 – Andomar

+0

@Andomarはい、SNAPSHOTを使用する場合は、データベースレベルで有効にする必要があります。あなたのtransacationsがそれを使用するためには、あなたはまだ、常にデフォルトであるCOMMITTED代わりにREADのスナップショットを使用するために、そのトランザクションの分離レベルについては、SET TRANSACTION ISOLATIONのレベルのスナップショットを使用する必要があります。 – mrdenny

0

あなたは私たちは、我々が設定し、すべての接続のためにこれを行う作業

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

を呼び出すことにより、データベースへの接続を設定するときは、ロック分離レベルを設定することができ、それらはすべてに設定されていますデータベースにアクセスするために共有接続プールを使用するのと同じ場所。 READ UNCOMMITTEDオプションは、その接続によって発行されたすべてのステートメントに適用されます。

+0

うーん、私は 'READ UNCOMMITTED'を全面的に設定することはお勧めしません。本当にデータベースの使用状況によります。 SQL Server 2005+は、スナップショットの分離をサポートし、Oracleの動作と同様に行を本質的にバージョン化します。 – pjp

+0

「コミットされたスナップショットを読んでください」と「コミットされていません」を混同しています。前者は、「トランザクション分離レベルを設定する」と選択できない比較的未知の設定です。Ahmad Mageedの記事を参照してください。 – Andomar

関連する問題