2012-03-20 6 views
0

MySQLでIQToolkitを使用すると、トランザクション内でLOCKING READを実行し、mysqlドキュメントに応じて、 "SELECT ..."を使用します。 FOR UPDATE "と表示されます。 しかし、LINQはデフォルトでこれをサポートしていないと思われます。ChangeConflictExceptionを処理することによって、同様の目標を達成することについてはthis threadが見つかりました。 MySQLでIQToolkit LINQプロバイダを使用して同じことを行う最善の方法は何ですか?MySQLでIQToolKitを使用する際にselect for updateを達成する方法

答えて

0

IQToolkitには、行ロックを要求する機能がありません。ただし、トランザクションを使用している場合は、トランザクションの分離レベルに応じて、トランザクション内で発生する読み取りの読み取りロックを取得する必要があります。

LINQ to SQLにはオプティミスティックな並行処理がサポートされているため、トランザクション内のデータを読み取らないことが期待されますが、変更を送信するとトランザクション内に入りますあなたの代わりにカバー)。楽観的な部分は、更新が送信されたときに発生します。データを読み込んだ後に行が変更された場合、それらの行の更新は失敗します。これにより、全体を中止するか、新しい読み込みなどで自動的にやり直すか、変更の競合例外の情報を使用して、変更内容をデータベースの変更とマージしてから再提出する方法が選択されます。ピック・アンド・チョイス・アプローチは複雑で、あなたが何をやっているのか分からない限り、おそらく「最初からすべてをやり直してください」アプローチを使うべきです。

IQToolkitには、「選択して選択して再送信する」アプローチを使用できる機能がありません。したがって、オプティミスティックな並行処理を試みると、更新が失敗した場合にすべてを再試行するのが最良です。悲観的な並行性を使用し、トランザクションの下に読み込みクエリを置くだけで、必要なロックが得られない場合は、IQueryableクエリプロバイダを構築するためのソースキットとサンプルとして、IQToolkitにその機能を自由に追加できます。

関連する問題