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.htm

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

しかし、これを行う場所が見つかりません。ロック方法はどこで変更できますか?

4

3 に答える 3

5

ALTER コマンドを使用してそれらを設定する方法の例とともに、行のバージョン管理ベースの分離レベルの使用について読むことができます。

これは、次のようにデータベース レベルで設定されます。

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON;

より良い出発点は、関連トピックをカバーする上記のドキュメントの親です:データベース エンジンにおける行のバージョン管理に基づく分離レベル

編集:以下の私のコメントに記載されているリンクを追加しました。

于 2009-08-31T07:53:49.087 に答える
1

SNAPSHOT 分離レベルを使用すると、データベースの負荷が増加するにつれて、tempdb に多くの負荷が追加されます。

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

ステートメント内で WITH (ROWLOCK) ヒントを使用してステートメント レベルごとに処理する必要がある、既定のページ レベル以外のレベル (行レベルのロック) で SQL Server のロックを処理する必要がある場合。

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

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

于 2009-08-31T09:13:31.813 に答える
0

データベースへの接続をセットアップするときに、ロック分離レベルを設定できます。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

私が働いている場所では、セットアップするすべての接続に対してこれを行います。データベースへのアクセスに共有接続プールを使用するため、それらはすべて同じ場所にセットアップされます。READ UNCOMMITTED オプションは、その接続によって発行されたすべてのステートメントに適用されます。

于 2009-08-31T10:16:49.673 に答える