0

私の悪い英語でごめんなさい。私は最近、Visual C# でのプログラミングに取り組みましたが、エキスパート プログラマーではありません。この簡単な紹介の後、編集作業中にレコードの管理競争を実装するために必要な重要なこと。これは、このソフトウェアを同時に 2 台のコンピュータで使用している場合、最初にレコードの編集を開始したコンピュータがレコードを「ロック」する必要があるため、プログラムの 2 番目のインスタンスで同じレコードを変更しようとすると、標準メッセージが表示され、手順が中断されます。私は実際にMySQL DBMSを使用していますが、できることは、コミットするか接続を閉じるまで、「START TRANSACTION」でレコードをロックすることだけです。問題は、私がそうではないことです」プロシージャを停止するためのアクティブなトランザクションまたは何らかのブロックがあるかどうかを確認する方法がわかりません。これは、プログラムの 2 番目のインスタンスが最初のインスタンスからレコードを解放するまで完全にブロックされることを意味します。ソリューション?ご清聴ありがとうございました。

4

1 に答える 1

0

一般に、ユーザーが作業しているレコードを物理的にロックするのは良くない設計です。データベースのロックは短いはずです。トランザクションの開始とコミットの間にはコードの実行のみが必要であり、ユーザーの操作はまったくありません。

「楽観的ロックと悲観的ロック」をグーグルで検索して、この件についてさらに理解することができます。

悲観的ロックを使用する必要がある場合は、データベース ロックの代わりにある種のスマート ソフトウェア ロックを実装する必要があります。たとえば、Current_Edit_By と Current_Edit_Time に 2 つのフィールドを追加できます。ユーザーがレコードの編集を開始すると、これらのフィールドにユーザー ID と現在の日時を入力します。別のユーザーが同じレコードを編集しようとすると、これら 2 つのフィールドを確認し、そこに値がある場合はエラーを表示します。

もちろん、ユーザーがレコードをコミットせずにデータベースから切断した場合、ロックされたレコードを自動的に消去するメカニズムを実装する必要があります。したがって、日時フィールド (接続が存在しない限り、たとえば 30 分以上経過したロックをクリアするため)。

于 2012-11-24T19:10:34.827 に答える