問題タブ [table-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.
entity-framework - EntityFrameworkでselectを使用してテーブルをロックする
私はこのようなことをする必要があります
EntityFrameworkを使用します。これは可能ですか?TransactionScope
分離レベルでを開きましたSerializable
が、selectがテーブルをロックしていません。トランザクションスコープが完了するまでロックしてほしい。
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)」を指定する
ruby-on-rails - 複数のdelayed_jobを実行するRails - ロックテーブル
おい。バックグラウンド処理にはdelayed_jobを使用しています。8 つの CPU サーバー、MySQL があり、7 つのdelayed_job プロセスを開始します
Q1: 2 つ以上のdelayed_job プロセスが同じプロセス (データベースdelayed_jobs の同じレコード行) の処理を開始する可能性があるかどうか疑問に思っています。delayed_job プラグインのコードを確認しましたが、あるべき方法でロック ディレクティブを見つけることができません (ロック テーブルまたは SELECT...FOR UPDATE がありません)。
各プロセスは、lock_by 列で UPDATE を実行する前にデータベース テーブルをロックする必要があると思います。locked_by フィールドを更新するだけでレコードをロックします (UPDATEdelayed_jobs SET locked_by...)。本当にそれで十分ですか?ロックは必要ありませんか?なんで?UPDATE は SELECT より優先度が高いことは知っていますが、この場合は効果がないと思います。
マルチスレッドの状況についての私の理解は次のとおりです。
場合によっては、より多くのジョブが同じ情報を取得して、同じプロセスの処理を開始できると思います。
Q2: 8CPU サーバーの場合、delayed_jobs の 7 は適切な数ですか? はい/いいえ。
10倍!
mysql - MySQLロックテーブルは関連するビューに影響しますか?
したがって、PDO / PHP / MySQLのパフォーマンス:パフォーマンスの問題に関するトランザクションと直接実行を読んだ後、MySQLでテーブルをロックする方法について調査したいと考えていました。
http://dev.mysql.com/doc/refman/5.0/en/table-locking.html _
テーブルロックを使用すると、多くのセッションが同時にテーブルから読み取ることができますが、セッションがテーブルに書き込みを行う場合は、最初に排他的アクセスを取得する必要があります。更新中、この特定のテーブルにアクセスする他のすべてのセッションは、更新が完了するまで待機する必要があります。
この部分は、私たちのクエリのほとんどが挿入ではなく更新であるため、特に私を驚かせました。すべての更新/挿入が実行されるfooというテーブルを作成してから、すべての選択が行われるfoo_view(fooのコピー、またはfooと他のいくつかのテーブルとfooのリンク)というビューを作成したのではないかと思いました。このロックの問題は引き続き発生しますか?
つまり、foo_viewのSELECTクエリは、fooで更新が完了するまで待機する必要がありますか?
同僚が尋ねたもう1つの簡単な質問。これはキャッシングに影響しますか?つまり、SELECTがキャッシュされている場合、SELECTはキャッシュにヒットして結果を返しますか、それともロックが最初に終了するのを待ちますか?
php - 更新を選択して、電子商取引を行い、PHP で MySQL ストアド プロシージャを呼び出すことは可能ですか?
現在、クライアント用の PHP e コマース Web サイトを構築しています。順調に進んでいますが、障害にぶつかり、MySQL/PHP の専門家が助けてくれるかどうか疑問に思っていました。基本的に、e コマース サイトは商品を 1 回だけ販売します (つまり、商品ごとに 1 つの数量しか在庫がありません)。つまり、顧客がその商品をチェックアウトすると、それ以上購入することはできません。
そのため、チェックアウト時に、商品がまだ在庫があるかどうかを確認する必要があります。これがトラフィックの多いサイトであると仮定すると、2 人以上の顧客が同時にチェックアウトしようとする場合があり、両方が製品を購入できる可能性があります。それを防ぐために、私の計画は次のとおりです。
- テーブルの行をロックするには、製品で [...FOR UPDATE] を選択します。
- 電子商取引を行う (Paypal、authorize.net など)
- e コマース トランザクションが成功した場合は、MySQL ストアド プロシージャ (SQL トランザクションも持つ) を呼び出して、注文情報などを保存します。または、失敗した場合はロールバックします。
この計画を実現することは可能ですか?SELECT...FOR UPDATE を実行するには、SQL トランザクションを開始する必要がありますが、その後、MySQL ストアド プロシージャ内のステップ 3 で別のトランザクションも開始しています。何が起こるかわかりません。また、この計画は行き詰まりのシナリオにつながりますか?
長い質問で申し訳ありませんが、助けていただければ幸いです。
performance - SQL Server - データをロックせずに大きなテーブルをマージする
非常に大きなデータ セット (最大 300 万レコード) があり、毎日のスケジュールで更新と新しいレコードをマージする必要があります。レコード セットを実際に 1000 個のレコード チャンクに分割し、MERGE
一時テーブルでコマンドを使用して、データの更新中にライブ テーブルがロックされないようにするストアド プロシージャがあります。問題は、それがまったく役に立たないことです。テーブルは依然として「ロックアップ」しており、データにアクセスしようとすると、データを使用する Web サイトがタイムアウトを受け取ります。私はそれを 100 個のレコード チャンクに分割してみましたWAITFOR DELAY '000:00:5'
。それはまだかなり鈍いです。
テーブルをロックせずに大量のデータをマージする方法に関する提案、ベスト プラクティス、または例を探しています。
ありがとう
mysql - 大きなテーブルの場合、テーブルレベルのロックが行レベルのロックよりも優れているのはなぜですか?
MySQLのマニュアルによると:
大きなテーブルの場合、多くの場合、テーブルのロックは行のロックよりも優れています。
どうしてこれなの?より大きなテーブルをロックすると、より多くのデータがロックされるため、行レベルのロックの方が優れていると思います。
database - 書き込みのためにDBテーブルまたは行の範囲をロックする方法は?
主キーを持つ単純なテーブルがあります。読み取り操作のほとんどは、キーの正確な値によって 1 つの行をフェッチします。
各行のデータは、キーの順序でその前後の行と何らかの関係を維持しています。したがって、新しい行を挿入するときは、間に入る2行を読み取り、計算を行ってから挿入する必要があります。
懸念事項は、明らかに、別の接続が同じ間隔でキー値を持つ行を同時に追加する可能性があることです。2 番目の挿入が失敗するのとまったく同じキーの値である場合はカバーされますが、キーの値が異なるが同じ間隔である場合、関係が壊れる可能性があります。
解決策は、新しい行を追加することを決定したときに書き込み用にテーブル全体をロックするか、(可能であれば、疑わしい) キー値の間隔をロックすることです。それでも、その時点で読み取り専用トランザクションがブロックされないようにしたいと思います。
クライアント プログラムと IBM DB2 フリー エディションで C++ 用の libodbc++ ラッパーを使用して ODBC を使用しています (ただし、DB の選択は変更される可能性があります)。これは私がやろうと思ったことです:
- 自動コミットとデフォルトの分離モードで接続を開始します
- 新しい行を追加する必要がある場合は、auto-commit を false に設定し、分離モードを serialized に設定します
- 新しいキー値の前後の行を読み取る
- 新しい行を計算して挿入する
- 専念
- 自動コミットとデフォルトの分離モードに戻る
これは仕事をしますか?他のトランザクションは同時に読み取ることができますか? それを行う他の/より良い方法はありますか?
ところで、libodbc++ i/fa で読み取り専用トランザクションを指定する方法がわかりません。odbcで可能ですか?
編集:非常に有用な回答をありがとう、私は1つを選択するのに苦労しました.
mysql - テーブルをロックせずに巨大な MySQL 本番テーブルにインデックスを作成する
~5M 行の MySQL テーブルにインデックスを作成する必要があります。これは実稼働テーブルであり、CREATE INDEX ステートメントを実行すると、すべてが完全にブロックされるのではないかと心配しています...
挿入と選択をブロックせずにそのインデックスを作成する方法はありますか?
システムを停止してインデックスを作成し、再起動する必要はありません。
mysql - ON INSERTトリガーが処理されると、innodbテーブルはどのようにロックされますか?
私は2つのinnodbテーブルを持っています:
記事
投票
新しいレコードがテーブルに挿入されたら、すべての投票の合計を計算してテーブルのフィールドvotes
を更新したいと思います。sum_votes
articles
質問
votes
SUM()計算自体が非常に重い場合(テーブルに700Kレコードがある場合)、どちらの方法がより効率的です。
1.トリガーの作成
2.アプリケーションで2つのクエリを使用する
最初の方法はよりクリーンに見えますが、SELECTクエリが実行されている間はテーブルがロックされますか?