InfoQ

News

NOLOCKをLINQ to SQLおよびLINQ to Entitiesで実装

作者 Robert Bazinet, 翻訳者 編集部 投稿日 2008年3月24日 午前3時20分

コミュニティ
.NET
トピック
データアクセス
タグ
SQL Server 2005,
Microsoft,
LINQ

近ごろScott Hanselman氏は、 LINQ to SQLおよびLINQ to Entitiesを使用する際のヒントを取り上げた、非常に役立つ記事(ブログ・英語)をブログ上に掲載した。問題は、SQLデベロッパが慣れているように、LINQクエ リで生成されたSQLを獲得し、NOLOCKヒントを使用する方法である。

LINQ to SQLはSQLクエリを動的に作成するので、クエリの外観に影響を与えることは重要なことである。Scott氏は、すべてにおいてNOLOCKを使用するのではなく、NOLOCKは最終手段として使用すべきだと指摘している。

しかしながら、NOLOCKを使用すること(「誰もが」それをどこかの時点で使用したことがあるけれども)は、一般的に最終手段だと考えられている。NOLOCKを使用するクエリは、正しい結果を返すことを保証されていない。技術的には、まったく返さない。

SQL 2005は、スナップショットベースの分離レベル(source)があり、ダーティー読み取りを許可せずに、リーダーをブロックしているライターから阻止したり、またその逆にライターをブロックしているリーダーから阻止したりする。

過去にNOLOCKがかなり大きいシステムで非常によく機能したと言ったが、 NOLOCKを拒む人がいるのを耳にする。確かにそれは個人の「正しい結果」に対する定義に因る。

Scott氏は、NOLOCKヒントを追加するタスクを遂行する以下の3つの方法を挙げた。

推奨される方法は、LINQ to SQLまたは LINQ to Entitiesのどちらか一方で生成されたコマンドのトランザクションオプションに影響を与える方法としてTransactionScopeを使用することである。

LINQ to SQLは、コンテキストでのトランザクションの設定を明確にサポートするので、コンテキストからその関係が分かり、開いたり、トランザクションを開始した り、コンテキストで設定したりできる。これはSQL 2005がトランザクションを推進しすぎているときに望ましい とされるが、推奨されるメソッドはTransactionScopeである。

ProductsNewViewData viewData = new ProductsNewViewData();
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions {
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
}))
{
viewData.Suppliers = northwind.Suppliers.ToList();
viewData.Categories = northwind.Categories.ToList();
}

2つ目の方法は、試行された真のストアードプロシージャーである。

2つ目の方法は、 クエリが読み出し元のテーブルをロックダウンする必要がないならば、未だにLINQ to SQLからStored Procedures(sprocs)を作成したり呼び出すことが可能であり、これらのsprocsにはNOLOCKが含まれる可能性があり、TransactionScopeはLINQ to SQLまたはLINQ to Entity生成のSQLにとってより良い選択である。

3つ目の方法は、以下のようにDataContextレベルでそれを設定することである。

それをDataContextレベルで設定するという3つ目の方法は、(そのコンテキストで実行されたすべての生成済みLINQ to SQLクエリに明らかに影響を与えるが)、 以下のコマンドを実行することである。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED (source)

Scott氏によるそれぞれの手法には確かに賛否両論ある。そもそもNOLOCKを使用することについて、またデプロイメントを考慮したときに NOLOCKはどこで存続すべきかについての議論もある。たとえば、NOLOCK設定が推奨される方法でおこなわれ(オプション1)、NOLOCKがもはや不必要となったとき、完全なバイナリデプロイメントが必要となる。しかし、NOLOCKがストアードプロシージャーメソッドで使用される場合、唯一の変更はデータベースレベルでおこなわれる。

もちろんNOLOCKは、こんにちSQLで使用されている数多くのヒントの1つに過ぎず、他のヒントが同様に使用できない理由はどこにもない。

LINQ to SQLやLINQ to Entitiesの詳細については、MSDNのWebサイト(source)を参照。Scott Hanselman氏については、自身がブログを書いているComputerzen.com(ブログ・英語)で参照できる。

 原文はこちらです:http://www.infoq.com/news/2008/03/linq-nolock

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

"YUKATA"から始まるコミュニケーション(Agile2008 ライトニングトークより)

私は「浴衣」を着てパーティーに参加したことで、たくさん声を掛けていただけました。 そこで感じたことは、このカンファレンスが人との繋がりを生み出し、また言葉の壁を越えて積極的に交流する場所であることです。民族衣装はそれらを助けてくれるものでした。きっとこの交流が、新たなムーブメントをアジア圏の仲間たちにも与えてくれると確信しています。

ソフトウェアのリーン思考入門

これは、InfoQ Chinaのアジャイル編集者、Jacky Li氏によるリーン思考とリーン思考をどのようにソフトウェア開発に適用するかについての入門です。

Java 6のスレッド最適化は実際に動作しているのか?

2つのパートからなるこの記事では、シングルスレッドベンチマークの助けを借りて、Java 6のスレッドのパフォーマンスに関する疑問に答える試みをしようと思います。

平鍋氏のGordon Pask Award受賞スピーチ

Agile2008において、Gordon Pask Awardの授与式が行われ、その一人として、チェンジビジョンの平鍋氏が受賞しました。本賞は、毎年、アジャイルコミュニティで定評のあるリーダーだけではなく、新たなリーダーになる可能性のある者に贈られるものです。InfoQでは、授与式のスピーチを動画にてお送りします。

Linda Rising氏による「誰を信頼しますか?」

Agile2008の3日目、8/6(水)午前中の、Linda Risingによるセッションです。セッションの冒頭、Linda Risingはとてもゆったりとしたきれいな、わかりやすい英語で話し始めました。

Jean Tabaka氏による「Collaboration Explained--真のアジャイルチームのためのファシリテーションツール」

Jean Tabaka氏の書いた書籍では、会議などのチーム活動において、ファシリテーションの手法とツールについて具体的かつ実践的に説明しています。8/8(金)、Agile2008の最終日の朝のセッションでは、Jean Tabaka氏自身が本の内容をベースとしたセッションを行いました。

Hubert Smits氏による「ゲーム・デザイン・ワークショップ」

Agile2008の4日目となる8/6(木)の8:30から、Hubert Smits氏による「ゲーム・デザイン・ワークショップ」がおこなわれました。ゲームと言っても単なる遊びではなく、「フレームゲーム」と呼ばれる、グループでの情報収集や意志決定、また教育やトレーニングの教材として使えるいろいろなゲームです。

スケーラビリティに関するベストプラクティス:eBayからの教訓

eBayが日々挑んでいる主要なアーキテクチャの勢力は、スケーラビリティです。これはアーキテクチャや設計に関するあらゆる意思決定を特徴づけたり、駆り立てたりします。