問題タブ [rowlocking]
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.
mysql - MySQL の 'SELECT ... FOR UPDATE' でロックされているレコード
MySQL の InnoDB で行レベルのロックを読んでテストしましたが、「MySQL でロックがどのように機能するか知っている」と実際に言うのはまだ難しいと思います!
これが私のテストデータです:
行レベル ロックに関する MySQL の動作をテストするために、2 つのターミナルを開き、MySQL に接続しました。私はそれらに名前を付けるつもりmysql1>
ですmysql2>
. 最初の端末で実行したものは次のとおりです。
次に、2番目の端末で:
驚いたことに、上記のクエリは最初のクエリによってブロックされます! だから私は最初の端末をロールバックして最初からやり直しました:
次に、2番目の端末で:
再び、2 番目の端末が 1 番目の端末によってブロックされました。テーブルのすべてのレコードがロックされていないシナリオはありますか? そうでない場合、これが「行レベルのロック」と呼ばれるのはなぜですか?
php - PHP - MySQL 行レベル ロックの例
Select FOR UPDATE の使用法と行をロックする方法を説明している投稿をたくさん見てきましたが、ロックされている行をコードが読み取ろうとしたときに何が起こるかを説明する投稿を見つけることができませんでした。
例えば。以下を使用するとします。
この場合、ロックが成功したかどうかを確認するにはどうすればよいですか? 行が既にロックされているシナリオを処理する最善の方法は何ですか?
これがどこかに記述されている場合は申し訳ありませんが、私が見つけたように見えるのは、そこにある「ハッピーパス」の説明だけです。
php - 行レベルのロック - MySQL - 更新用
テーブルの行ロックについてまだ混乱しています。私は MySQL/PHP を使用しています。これが私のシナリオです。
アプリケーションがリクエストと投稿を追跡するために使用する一連のテーブルがあります。ユーザは、アイテム (テーブル ITEM (I)) の投稿 (テーブル POSTING (P)) を作成し、個々のユーザに要求を送信したり (テーブル REQUEST (R))、投稿して投稿応答を受信したり (テーブル POSTING_RESPONSE (PR) ))ユーザー投稿アイテムによって受け入れられます。
例: 私は自転車のユーザーです。私はそれを投稿し、個々のユーザーにリクエストを送信します。私からのリクエストを受け取ったユーザーは、受け入れる/拒否する/何もしないことができます。彼らが受け入れる場合 - それは予約されています。他のユーザーは私の投稿を見つけて、アイテムに「応募」できます。私には、彼らの要求を「受け入れる」または「無視する」能力があります。私が受け入れると、アイテムは予約されます。
誰かがリクエストを受け入れたらやりたいこと:
item に対応する ITEM (I) テーブルの行をロックする
項目に対応する POSTING (P) テーブルの行をロックします (行が存在する場合)。
アイテムに対して送信されたすべての要求に対して、REQUEST (R) テーブルの行をロックします
item に対応する POSTING_RESPONSE (PR) テーブル (行が存在する場合) の行をロックします
ITEMステータスを「予約済み」に更新
POSTING ステータスを「利用不可」に更新する
すべて/任意の POSTING_RESPONSE を「拒否済み」に更新します
受け入れたリクエスト以外のすべてのリクエストを「拒否」に更新 - そのリクエストを「受け入れ」に更新
この例でのステータスの重複は無視してください。
ここで、#1 - 4 は、単純な "select ... for update" を実行して、AUTOCOMMIT を false のままにできると想定しました。これらの select ステートメントを使用して、更新する必要があるかどうかを判断できます。必要な場合は、更新を続行できます。次に、更新 #5 ~ 8 の完了後、コミットして行のロックを解除します。
これを機能させるのに問題があります。それが私がしていることによるものなのか、それとも私の考えが間違っているためなのかはわかりません。
もう 1 つ...アイテムのステータスを EXPIRED または CANCELLED に更新できる他のプロセスがあります。私のアプローチに対する唯一の解決策は、考えられるすべての条件を UPDATE ステートメント内の WHERE 句に入れることではないことを願っています...これは簡単に保守できません。
c# - Entity Frameworkで行を完全にロックする方法
私は、お金の取引をしている状況で働いています。
たとえば、ユーザーのウォレットのテーブルがあり、その行に残高があります。
現在、私たちの Web サイトと Web サービスでは、特定のトランザクションが発生するたびに、次のことを行う必要があります。
- そのトランザクションを実行するのに十分な資金があることを確認します。
- 残高からトランザクションのコストを差し引きます。
トランザクションの全期間にわたってその行/エンティティをロックする正しい方法と方法は何ですか?
私が読んだことから、EFがエンティティをマークし、それをDBに保存するときにそのマークを比較するソリューションがいくつかありますが、別のユーザー/プログラムがすでに金額を編集した場合はどうなりますか?
EFでこれを達成できますか? そうでない場合、他にどのようなオプションがありますか?
ストアド プロシージャを呼び出すと、プログラム A がロックしている間、他の誰も SQL Server のその行にアクセスできないように、行を適切にロックできますか?
c# - (my)ユーザーがデータを入力している間のSQL行ロックC#
複数のユーザーがエンティティに関する情報を編集できるデータベースを使用してアプリケーションを作成しようとしています。
tldr: ユーザーが C# で情報を編集しているときに、データベース内の行をロックする方法。
クエリの実行中にデータベース内のレコードをロックすることについて調査しました。私がよく目にするのは、begin transaction
andでロックすることですcommit transaction
。ただし、クエリの実行時間よりも長くロックする必要があるため、これは私のニーズには合いません。
user1 がレコードを編集している場合 (C# で、フォーム アプリケーションを使用して、いくつかのテキスト ボックスに入力)、編集が完了するまでその行をロックする必要があります。同時に user2 が同じレコードを編集しようとする可能性があるためです。user1 が完了するまでにはすべて問題ありませんが、user2 が完了すると、検索していたレコード (名前) がもう存在しないことを上書きするか、エラーが返されます。
IsLocked
簡単な解決策は、ユーザーが行を編集できることに応じて、で列を追加することです。しかし、何らかの理由でアプリケーションがクラッシュしたり、ユーザーが強制的にタスク マネージャーでプロセスを停止したりすると、行は永久にロックされます。(または、これが発生している間にコードを実行する方法はまだありますか?)
もう 1 つの方法は、 を使用せずにクエリを実行することcommit transaction
です。そのためには、接続を開いたままにしておく必要があると思います。そうしないと、接続が終了します。アプリケーションの実行中に接続を開いたままにしておくことは、私にとっては良い考えではないように思えますか?
補足: タイトルには (my)sql と記載されています。これは、どちらを使用するのかよくわからないためです。
お時間いただきありがとうございます。
mysql - MySQL/InnoDB の行のロック ステータスをテストする
SELECT ... FOR UPDATE
MySQL 5.6 で複数の InnoDB テーブルの複数の行を予約する構文を使用しています。これにより、同時書き込み操作を互いに分離することができます。
前のトランザクションが終了するまで同時トランザクションが中断されたことを証明できたので、ロックが機能することはかなり確信しています。ただし、これはタイミングに依存するため、手動テストのみです。
ここで、自動化されたテストを書きたいと思います。
一部の行がロックされているかどうかを簡単にテストするステートメント、または現在ロックされている行のリストを返すステートメントはありますか?
java - 複数のJVMが同じデータベースにアクセスするときに、Javaで行レベルのロックを取得する方法は?
異なる JVM で実行されている同じアプリケーションの 3 つのインスタンスがあります。データベース内の特定の値が異なるアプリケーションによって同時に変更されることは望ましくありません。Javaでこの制限を適用するにはどうすればよいですか?