問題タブ [record-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net - ASP.NETでのレコードロックトークンの保存
私が現在取り組んでいるアプリケーションでは、複数のユーザーが同時に何かを編集したい場合があります。つまり、楽観的ロックを実装する必要があります。ただし、このアプリケーションの場合、編集されるアイテムは、データベース内の複数の異なるテーブルからのレコードを含む科学プロトコルです。
そのため、プロトコル全体が1人のユーザーによる編集用にロックされていることを示したいので、私の質問につながります。これを行うための推奨される方法は、データベースレベルで編集をイベント化することです(たとえば、プロトコルの一意のIDを確認し、ロックされているかどうかを確認します)、またはメモリ内のWebサーバー自体で現在ロックされているプロトコルを追跡するために受け入れられますか?
現在、アプリケーションのユーザー数は約100人(同時に20人程度)と予想されていますが、将来的にはその数が増える可能性があるため、最もスケーラブルなオプションを使用することを検討しています。
mysql - このクエリが遅いのはなぜですか? ここで InnoDB ではなく MyISAM を使用する必要がありますか?
スロークエリログでこれらを 1 時間に約 5 回取得しています。
record_lock テーブルは現在 InnoDB を使用しており、現在 12 未満のレコードが含まれています。
私たちのシステムには数千人のアクティブユーザーがいます。彼らがレコードを編集するたびに、このテーブルに挿入します。そして、システム内のあらゆるページがロードされるたびに、1) テーブルから SELECT を実行して、現在のユーザーのロックがあるかどうかを確認し、2) ユーザーのレコードがある場合は、そのテーブルに対して DELETE クエリを実行します。 WHERE 句のテーブルの主キー。
テーブルのスキーマは次のとおりです。
sql-server - SQL Serverトランザクションでレコードレベルのロックを使用するにはどうすればよいですか?
何年も前に、もともとデスクトップアプリとして作成されたアプリケーションがあります。編集画面を開くたびにトランザクションを開始し、[OK]をクリックするとコミットし、[キャンセル]をクリックするとロールバックします。これはデスクトップアプリでは問題なく機能しましたが、現在はADO.NETとSQL Serverに移行しようとしており、長時間実行されるトランザクションには問題があります。
複数のユーザーがすべて同じテーブル(の異なるサブセット)を同時に編集しようとすると、問題が発生することがわかりました。古いデータベースでは、各ユーザーのトランザクションは、トランザクション中に変更したすべてのレコードに対するレコードレベルのロックを取得していました。さまざまなユーザーがさまざまなレコードを編集していたため、全員が独自のロックを取得し、すべてが機能します。ただし、SQL Serverでは、1人のユーザーがトランザクション内のレコードを編集するとすぐに、SQLServerはテーブル全体をロックしているように見えます。2番目のユーザーが同じテーブル内の別のレコードを編集しようとすると、最初のユーザーがコミットまたはロールバックするまでSqlConnectionがブロックされるため、2番目のユーザーのアプリは単にロックアップします。
長時間実行されるトランザクションが悪いことは承知しています。最善の解決策は、これらの画面を変更して、トランザクションを長時間開いたままにしないようにすることです。しかし、それは侵襲的でリスクの高い変更を意味するので、このコードをそのまま稼働させる方法があるかどうかも調査したいと思います。そうすれば、自分の選択肢が何であるかがわかります。
SQL Serverで2人の異なるユーザーのトランザクションを取得して、テーブル全体ではなく個々のレコードをロックするにはどうすればよいですか?
これは、問題を説明する手っ取り早いコンソールアプリです。「test1」というデータベースを作成しました。「Values」というテーブルが1つあり、ID(int)列とValue(nvarchar)列だけがあります。アプリを実行すると、変更するIDを要求され、トランザクションが開始され、そのレコードが変更されてから、Enterキーを押すまでトランザクションが開いたままになります。できるようになりたい
- プログラムを起動し、ID1を更新するように指示します。
- トランザクションを取得してレコードを変更します。
- プログラムの2番目のコピーを開始し、ID2を更新するように指示します。
- 最初のアプリのトランザクションがまだ開いている間に、更新(およびコミット)できるようにします。
現在、アプリの最初のコピーに戻ってアプリを閉じるか、Enterキーを押してコミットするまで、手順4でフリーズします。command.ExecuteNonQueryの呼び出しは、最初の接続が閉じられるまでブロックされます。
動作に変更を加えずに、私がすでに試したいくつかのことを次に示します。
- トランザクション分離レベルを「コミットされていない読み取り」に変更する
- UPDATEステートメントで「WITH(ROWLOCK)」を指定する
transactions - オンライン注文用のトランザクションが既にある場合、レコード レベルのロックが必要ですか? (コンサートチケットまたは航空券の予約について)
コンサートの座席や航空券をオンラインで注文する場合、レコード レベルのロックが必要ですか、それともトランザクションで十分ですか?
コンサートのチケット(例えば座席番号20B)や航空券(例えばオーバーブッキングでも制限は210)の場合、ウェブサイトはチケット購入画面を表示したときにレコードをロックしたり、トランザクションを開始したりできないと思います。
しかし、ユーザーが「購入の確認」をクリックした後、サーバーはトランザクションを開始し、座席番号 20B を購入して、コミットを試みる必要があります。
別のユーザーが以前のトランザクションでシート 20B を既に購入している場合、現在のトランザクションが失敗するのは「コミット」部分ですか?
では... レコード レベルのロックは必要ないのでしょうか? トランザクションは常に (次々に) シリアル化されるので、「競合状態」がないことを確認できますか? では、どのような状況でレコード レベルのロックが必要になるのでしょうか?
asp.net - 2人のメンバーがレコードにアクセスしようとしているときにレコードをロックするにはどうすればよいですか?
私はこのようなシナリオを持っています、
私の環境は.Net2.0、VS 2008、Webアプリケーションです
2人のメンバーが同時にアクセスしようとしているときに、レコードをロックする必要があります。
私たちは2つの方法でそれを行うことができます、
フロントエンド(sessionIDを入れ、辞書に一意の番号を記録し、静的変数またはアプリケーション変数として保持する)により、投稿ボタンがクリックされた後、応答がそのページから出て、クライアントが接続されていないときに解放します。セッションが終了しました。
バックエンドによる(DB自体のレコードロック-調査する必要があります-私のチームメンバーが探しています)。
他に方法はありますか?また、すべてのステップで他の方法を検討する必要がありますか?
条件がありませんか?
php - flex または zend amf でのレコードのロック
複数のユーザーがいるフレックス (Flash Builder 4) アプリケーションでレコードのロックをどのように処理しますか?
zend amf を使用してデータベース (mongodb または mysql) と通信しています。
たとえば、ユーザー 1 が編集用にクライアント レコードをロードし、ユーザー 2 が編集用に同じクライアント レコードをロードした場合、ユーザー 1 が編集を保存し、次にユーザー 2 が編集を保存すると、ユーザー 1 が編集していたことを知らずにデータが失われます。 .
ロックフラグまたはロックテーブルを使用して独自のシステムを実装し、レコードが開かれたときにロックをチェック/ロックを設定できると思います。しかし、人々がこれを行うために使用する、テスト済み/証明済みの何かがすでにあることを願っています。
php - MySQL で最大値をロックする
PHPを使用してMySQLで次のクエリを使用しています
テーブル CART の構造は
CART (SrNo int(10));
現在、結果を使用して何らかの処理を行い、1 をインクリメントして最大値をこのテーブルに挿入しています。私の問題は、user1 が最大値を取得しておりSrNo
、処理の中間にある場合です。この間、user2 も、user1 が取得したのと同じ SrNo の最大値を取得し、処理を開始することをサーバーに要求します。
両方の処理とテーブルへの挿入が完了すると、テーブル CART に 2 つの複製が作成されます。どうすればこれを防ぐことができますか?
SrNo
つまり、 1 人のユーザーが処理を終了しない限り、他のユーザーが untilの最大値を取得しないようにしたいと考えています。
c# - ユーザーのasp.netでページをロックする
asp.net ページのロックに関する問題に直面しています。最初に開いたユーザーのためにそのページをロックする必要があるユーザー プロファイル ページがあります。詳細は次のとおりです。データベースには多くのユーザー プロファイル レコードがあり、レコード番号をクエリ文字列に渡して特定のページを開きます。ユーザーがグリッドのリンクボタンをクリックし、レコードを読み取り専用モードで開きます。すべてのコントロールを有効にし、クリックするとユーザーが使用できるようにする編集ボタンがあります。タスクは、最初に編集ボタンをクリックしたユーザーにレコードをロックすることです。
これとは別に、ユーザーがページから移動したり、途中でページを閉じたりするなど、多くのシナリオがあります。このような場合、レコードは他のユーザーが利用できる必要があります。シナリオを解決する方法のいくつかの可能なアプローチまたは例を教えてください。
前もって感謝します
api - Salesforce:時間依存のワークフローによってロックされるレコード
現在、販売プロセスにSalesforceを使用しています。これには、ユーザーに「アカウント管理システム」へのサインアップ、詳細、ドキュメントの送信、および管理者によるレビューの取得を試みることが含まれます。これはSF以外のPHPシステム全体であり、「チェリー」と呼びましょう。
現在行っていることは次のとおりです。Cherryはアカウントを追跡しますが、発生したことはすべてSalesForceに送信されるため、営業担当者は連絡先のリストを持っています。Cherryで何かが変更されると、SalesForceで更新されます。たとえば、顧客がCherryの管理者によってレビューされたときに、SFリードをアカウントに変換します。(この後もSFデータを更新しますが、これはすでに顧客であるため、それほど重要ではありません)
CherryからSFに情報を送信するには、「SforceEnterpriseClient.php」APIライブラリを使用し、そのライブラリが提供するCreate / Update/Deleteメソッドを呼び出します。正直に言うと他に方法があるかどうかはわかりませんが、私たちのニーズは非常に単純です。リードを作成し、フィールドを更新して、アカウントに変換するだけです。
私の問題は、営業担当者が時間依存のワークフローを使用して、数日ごとにリードを自動的に電子メールで送信したり、あるステータスから別のステータスに変更したりすることを望んでいることです。ただし、リードがこれらのワークフローの1つに「取得」されると、レコードはロックされ(アクションが実行されるまで、通常は何日もかかります)、APIを介してレコードを操作しようとすると(更新、特に「convertlead」)、エラーRECORD_IN_USE_BY_WORKFLOWで失敗します。
現在、これはかなり一般的なシナリオのようです(APIを使用してレコードを更新することと、時間依存のワークフローを使用することの両方)。実際、SalesForceを使用することの全体的なポイントはワークフローであるように思われるので、これが失敗するのと同じくらい基本的なことにはかなり驚いています...
したがって、基本的な質問は....-この問題を回避する明白な方法はありますか?(他のAPIを使用していますか?ワークフローで何か別のことをしていますか?)
-そうでない場合、リードをワークフローから「切り離す」方法はありますか?(またはどういうわけかそのレコードのロックを解除します)
-そうでない場合、SalesForce側でより多くのプログラミングを意味する回避策はありますか?
ダニエル、本当にありがとうございました
sql-server-2005 - SQLServer機能-重複を防ぐ
SQLServer2005データベースがあります。Table A
ID列と、Id
複数の行にまたがる別の手動列があります。2番目のid
列はの形式で'0000000098'
あり、文字列である必要があります。データ型を変更できません。
Function A
最大ID
列値を取得し、それを1つインクリメントして、文字列としてキャストします。
ストアドプロシージャは新しいIDを取得し、このIDを使用していくつかの挿入を実行します。
更新が発生する前に、2つのクライアントがストアドプロシージャを実行して同じIDを取得しないようにするにはどうすればよいですか?procが処理を完了するまで、読み取りからテーブルaをロックできますか、それともより効率的な方法がありますか?
データ型や構造を変更できれば簡単ですが、できません。