0

複数のユーザーがエンティティに関する情報を編集できるデータベースを使用してアプリケーションを作成しようとしています。

tldr: ユーザーが C# で情報を編集しているときに、データベース内の行をロックする方法。

クエリの実行中にデータベース内のレコードをロックすることについて調査しました。私がよく目にするのは、begin transactionandでロックすることですcommit transaction。ただし、クエリの実行時間よりも長くロックする必要があるため、これは私のニーズには合いません。

user1 がレコードを編集している場合 (C# で、フォーム アプリケーションを使用して、いくつかのテキスト ボックスに入力)、編集が完了するまでその行をロックする必要があります。同時に user2 が同じレコードを編集しようとする可能性があるためです。user1 が完了するまでにはすべて問題ありませんが、user2 が完了すると、検索していたレコード (名前) がもう存在しないことを上書きするか、エラーが返されます。

IsLocked簡単な解決策は、ユーザーが行を編集できることに応じて、で列を追加することです。しかし、何らかの理由でアプリケーションがクラッシュしたり、ユーザーが強制的にタスク マネージャーでプロセスを停止したりすると、行は永久にロックされます。(または、これが発生している間にコードを実行する方法はまだありますか?)

もう 1 つの方法は、 を使用せずにクエリを実行することcommit transactionです。そのためには、接続を開いたままにしておく必要があると思います。そうしないと、接続が終了します。アプリケーションの実行中に接続を開いたままにしておくことは、私にとっては良い考えではないように思えますか?

補足: タイトルには (my)sql と記載されています。これは、どちらを使用するのかよくわからないためです。

お時間いただきありがとうございます。

4

1 に答える 1

1

ユーザーがある種の GUI フォームでデータを編集しているときに行をロックするのが最善の解決策だとは思いません。アプリケーションがクラッシュするか、ユーザーが長時間行を編集できる可能性があります...これは、使用する SQL エンジン (MS SQL、MySQL...) には依存しません。

  • レコードには一意の ID が必要です。そのため、クエリのようなもの UPDATE table SET ..... WHERE entityID = someID は以前の値に依存しません (可能な行の削除のみに注意してください)

  • 編集する前に値 (またはデータベース レコードの一部であるタイムスタンプ) を記憶し、行を更新する前にそれを確認して、誰かが同じレコードを変更したことを知り、ユーザーに通知することができます。

「接続を開いたままにする」について - DBConnection は IDisposable を実装しています。この投稿の使用方法をお読みください。接続を再度開くことを意識する必要はありません - SQL Connection Poolingについて読んでください。

于 2014-12-05T18:00:01.487 に答える