1

データベースまたは一連のテーブルを明示的にロックできるツールは Linq 内にありますか? 私はいくつかの異なるデータベースで作業しており、透過的なものを探しています。驚いたことに、Linq が同時実行の問題をどのように処理するかを扱ったトピックを除いて、このトピックについてはあまり見つけることができませんでした。これは私の範囲外です。

または、データベースをロックするための他の簡単な方法は、私にとって興味深いものです(特にMsSql、Sybase)

4

1 に答える 1

3

データベースのロックは、LINQ の範囲外です。関連する唯一のロックの側面は、特定のプロバイダーが同時実行性の保証を提供するために使用したロックのセマンティクスです。トランザクション処理によって自動的に適用されるものを超えて明示的なロックが必要な場合は、より低いレベルに移動する必要があります。

Entity Framework を介して任意の SQL コマンドを実行するExecuteStoreCommandには、SQL 文字列を実行するだけのデータベース コンテキストでメソッドを使用できます。何らかの理由で古い LINQ2SQL プロバイダーを使用している場合はExecuteCommand、同じ目的を達成するための同様の方法があります。

データベース全体を排他アクセスモードにすばやく切り替えて元に戻すことができるという意味で、「データベースロック」(少なくともデータベース用語)などは実際にはありません。Sybase (および MSSQL) の場合、適切な権限を持つユーザーは、「シングル ユーザー」オプションを設定することでこれを実行できます。

sp_dboption mydatabase, "single user", true

これは単にロックを取得するほど「簡単」ではありません。一度に 1 人だけがデータベースに接続できることを意味するため、オプションを設定するときに接続していることを確認する必要があります。オンになっていて、他に誰も接続していないこと (警告なしに開始されます)、完了したらオプションをオフに戻すことを確認してください。

私の知る限り、MySql では、ターゲット データベースに対する全員のアクセス許可を変更する以外に、これを達成する方法はありません。

ほとんどのデータベース サーバーには SQL に似た構文があるため、個々のテーブルをロックするのは少し簡単です。MySqlでは、またはロックを使用してLOCK TABLESコマンドを使用しますが、リンク先のページを読むことを強くお勧めします。Sybase にも同様のコマンドがあり、この場合は and と呼ばれます。READWRITELOCK TABLESHAREDEXCLUSIVE

transactionのコンテキスト内でテーブルをロックすることが期待されているためTransactionScope、ロックを行う前にコードを でラップすることをお勧めします。

于 2012-04-25T14:51:25.933 に答える