問題タブ [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.
sql-server - SQLServerデータベースからの一意の番号の確保
(他の種類の番号の中でも)インシデント番号を使用するアプリケーションがあります。これらの番号は、カウンターの現在の値を含む「Number_Setup」と呼ばれるテーブルに格納されます。
アプリが新しいインシデントを生成すると、number_setupテーブルが作成され、必要な番号カウンター行が取得されます(カウンターは毎日、毎週などにリセットでき、intとして保存されます)。次に、カウンターをインクリメントし、新しい値で行を更新します。
アプリケーションはマルチユーザーです(一度に約100人のユーザー、および数百のインシデントレコードを実行して取得し、それぞれのインシデント番号を要求するSQLジョブ)。インシデントテーブルには、重複してはならない重複するインシデント番号がいくつかあります。
ストアドプロシージャは、次のカウンタを取得するために使用されます。
そのブロックをトランザクションで囲みましたが、まだ共有ロックがあると思うので、問題が100%修正されるかどうかは完全にはわかりません。そのため、とにかくカウンターを読み取ることができます。
おそらく、updateステートメントでカウンターが更新されていないことを確認できます
これは、金融アプリなどの請求書番号でよくある問題だと確信しています。
ロジックをコードに入れて、そのレベルでロックを使用することもできません。私もHOLDLOCKでロックしましたが、そのアプリケーションがわかりません。2つのSELECTステートメントに配置する必要がありますか?
重複が作成されないようにするにはどうすればよいですか?
sql - MySQL InnoDB は影響を受ける行のみをロックしますか?
次のように、ユーザーを含む InnoDB テーブルがあります。
挿入ごとに user_id を 1 増やします。たとえば、Bob の次の user_id は 4 になります。
これを行うには、次のクエリを使用します。
ここで、2 人の異なるユーザーが同時に「Bob」を追加しないようにする必要があります。user_id 4 を持つ 2 つの Bob は必要ありません。Bob のユーザー ID はそれぞれ異なっている必要があります。
上記の挿入クエリを実行すると、ボブのすべての行を書き込みおよび更新してロックすることは可能ですか? 他の多くのユーザーがまだ行へのフル アクセスを必要としているため、テーブル全体をロックできません。また、すべての行が常に読み取り可能である必要があります。どうすればいいですか?
sql - SQL Server のロック機構について
SQL Server のロック メカニズムに関するいくつかの質問をしたいと思います
SQL ステートメントでロック ヒントを使用していない場合、SQL Server は既定で PAGELOCK ヒントを使用します。私は正しいですか?はいの場合、なぜですか?あまりにも多くのロックを管理していることが原因である可能性がありますが、これが唯一の欠点でした。他にもあれば教えてください。また、妥当な場合にこのデフォルトの動作を変更できるかどうかも教えてください。
サーバー側アプリケーション、同期サーバー (同期フレームワークを使用しない) を作成しており、C# コード ファイルでデータベース クエリを記述し、ODBC 接続を使用してそれらを実行しています。ここで問題は、欠点を念頭に置いてデフォルトのロックを Page から Row に変更する最良の方法は何ですか(たとえば、クエリにロックヒントを追加することを計画しています)。
SQL クエリ (SELECT/DML) がトランザクションのスコープなしで実行され、ステートメントにロック ヒントが含まれている場合、どの種類のロックが取得されますか (共有、更新、排他など)? AND トランザクション スコープ内では、ROWLOCK ヒントが使用されている場合、トランザクションの分離レベルはロック タイプに影響します。
最後に、上記のすべてのシナリオを自分でテストして体験できるように、サンプルを提供してくれる人がいれば (ドット ネット コードや SQL スクリプトなど)
ありがとうムバシャール
sql-server - SQL Server のロック アーキテクチャを開発者にとってより使いやすくするには、どのような変更を加える必要がありますか?
私は最近、このようなステートメントが主キーselect * from table with (rowlock updlock) where key=value
に対して実行されたときに、SQL サーバーが主キーに対してのみロックを発行することを拒否するという、かなり苛立たしい状況に遭遇しました。ここで誤解しないでください。行をロックしますが、さらに一歩進んでテーブルもロックします。
私は SQL ロックのエスカレーションについて読み、ロック ヒントで特定のインデックスを使用することを見てきましたが、何百万ものレコードと同時更新が必要なテーブルに多数のインデックスがある場合、これは実用的ではありません。それらのレコードで発生します。小さなテーブルと特定のクエリの場合、目的の動作を得ることができますが、テーブルの幅が広く (列が多く)、データを使用するプロセスが多数ある場合、この方法はうまく機能せず、実際の競合点になる可能性があります。
私が追加したいのは、行の主キーに対してロックを発行し、インデックス、テーブルスキャン、またはその他の方法が使用されるたびに、 PKLock (主キーロックの略) として新しいロックヒントサックです。行を取得すると、テーブル全体をロックする代わりに、このロックをチェックして尊重します。
このようなテーブル ロックを発行する必要がないため、DB に対するコードの並列実行の容量が大幅に増加します。
このアイデアについて検討し、潜在的な欠陥、改善できる方法、または私のジレンマを解決するために追加する必要があるその他の要素を指摘してください。
編集
@レムス
このクエリを実行すると
そして、このクエリ:
どちらの例でも、トランザクションをコミットする前に行 A が返されます。これはブロックではなく、更新の背後にある読み取りです。
成功するソリューションでは、使用するインデックスを指定せずに次のことを行う必要があります。
- クエリ 1 の場合: A の読み取りとロック、A の更新
- クエリ 2 の場合: B の読み取りとロック、B の更新、クエリ 2 のコミット
- クエリ 2 の場合: B を読み取り、A のロックが解放されるまでブロックされる
- クエリ 1 の場合: クエリ 1 をコミットする
- クエリ 2 の場合: A の読み取りとロック、A の更新、クエリ 2 のコミット
oracle - Oracle行ロックのキュー時間が長い
oracle 9 DBで以下のSQLコマンドを実行すると、「enq:TX-行ロックの競合」が発生し続けます。テーブルmytableは、300行未満の小さなテーブルです。
同時に10個のスレッドを実行し、更新の機会が得られるまで10秒も待つものもあります。このデッドロックの問題に直面することはわかっていますが、私にとっての問題は、テーブルが小さいため、テーブルが小さいため、更新が高速になるため、はるかに高速になるはずです。
編集:このコードを変更することはできません。サードパーティのアプリケーション内にあります。DBを微調整することしかできません。
ローロックキューの速度を向上させるために何ができますか?この待機時間を改善して、スレッドの実行速度を上げるにはどうすればよいですか?
sql - ROWLOCK、UPDLOCK を使用して結合 SQL ステートメントからレコードをロックできますか?
必要なデータを取得するためのストアド プロシージャがあります。
これらのレコードをカーソルに入れた後ROWLOCK, UPDLOCK
、関連するすべての請求書番号をロックしていました。
INVH
ストア プロシージャで結合コマンドを使用していくつかのテーブルからテーブルを選択した時点で、テーブルをロックできますか?
アドバイスをお願いします。
sql-server - SQL Server で行レベルのロックを強制することは可能ですか?
SQL Server で行レベルおよびページ レベルのロックをオフにする方法はわかりますが、SQL Server で行レベルのロックを強制的に使用する方法が見つかりません。SQL Server に強制的に行レベル ロックを使用させ、ページ レベル ロックを使用させない方法はありますか?
ruby - Ruby MongoDBドライバーの「アトミックセクション」?
MongoDBサーバーで(Rubyドライバーを使用して)一連の非アトミックアクションを単一のアトミックアクションとして実行する方法はありますか?私が必要としているのは、基本的に特定のオブジェクト/コレクションのロックです。
sql-server - INSERTトランザクションが存在しない場合、SELECTに対するSQL Server ROWLOCK
SQL Server 2005 から 2008 にアップグレードしました。2005 年には ROWLOCK がまったく機能せず、実際のロックを行うには PAGELOCK または XLOCK を使用する必要があったことを覚えています。これを読んだ人は「何を間違えたの?」と尋ねるでしょう。何もない。「ROWLOCKED」行を編集できることを最終的に証明しましたが、ロック レベルをエスカレートすると編集できませんでした。これが SQL 2008 で機能するかどうかを確認する機会はありませんでした。最初の質問は、2008 年にこの問題に遭遇した人はいますか?
私の2番目の質問は次のとおりです。値が存在するかどうかをテストし、存在する場合は、行全体を挿入するのではなく、関連する列に対して更新を実行したいと考えています。これは、行が見つかった場合、メンテナンス手順によってプロセスの途中でこの行が削除され、エラーが発生する可能性があるため、ロックする必要があることを意味します。
原理を説明するために、次のコードは機能しますか?
nhibernate - NHibernate で rowlock と readpast を使用するには?
現在、次のストアド プロシージャを使用してテーブルからデータを読み取るアプリケーションがあります。
ご覧のとおり、ストアド プロシージャは ROWLOCK と READPAST を使用して、多数の行 (@BatchSize によって制御される) が 1 つの接続のみで安全に読み取られるようにします。読み取り後、行は削除されます。
NHibernate で同じことを達成する方法を教えてもらえますか?