問題タブ [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.
mysql - Mysql ユーザーごとに連続した行を挿入する
「picks」というテーブルがあり、ユーザーがログインしてピックを開始すると、最初にそのユーザーの「picks」テーブルに64行が挿入されます(列としてユーザーIDがあります)。行はphpのループを使用して挿入されるため、PDOの準備済みステートメントを使用して64の挿入があります。これは、ユーザーごとに 1 回だけ実行する必要があります。そのユーザーに対してこれらの行が連続している必要があります。他の数人のユーザーがまったく同時に同じことをしている場合はどうなりますか? 行が連続して挿入されない可能性はありますか? テーブルロックを使用する必要がありますか? 私は以前にそれらを使用したことがありません。MySql バージョン: 5.0.92-rs-log MyISAM ありがとう
sql-server - MS Access は SQL Server のテーブルをロックしますか?
SQL Server を 2 年以上使用していますが、MS Access は初めてです。MS Access を SQL Server にアクセスするための潜在的なフロントエンド/ポータルとして検討し始めたところです。同僚と話していたところ、フォームが「正しくコーディングされていません。私は以前にテーブルロックを経験したことがあり、それらがどれほどイライラするかを理解できます. 私の同僚は、問題を解決するために「パススルー」と呼ばれるものを使用すると言いました。何が起こっているのか、「パススルー」がどのように問題を解決するのかを説明して、誰か助けてもらえますか?
mysql - MySQL は自動インクリメントなしで次の一意の値を取得します
組織で作業指示書を追跡するために開発している MySQL データベース (InnoDB) があります。複数の「サイト」があり、各サイトには 100 から始まる作業指示番号があります。
WorkorderIDは自動インクリメント フィールドです。
SiteIDとSiteWorkorderNumは、両方とも一意の制約として設定されます。
特定のサイトに新しい作業指示書が挿入されるときはいつでも、アプリケーションはログインしているユーザーのサイト ID の max(SiteWorkorderNum) をチェックし、その値を挿入ステートメントに返します。私が避けたい問題は、同じサイトの 2 人のユーザーがまったく同時に新しい作業指示書を入力した場合です。
考えられる解決策がいくつかありますが、それぞれに欠点があるため、より良い方法があるかどうかを確認したいと思いますが、1つは他の方法よりも優れていると確信しており、もちろん新しいアイデアを受け入れています.
1)テーブルをロックして、値を取得して挿入するまで、他のユーザーが SiteWorkorderNum 値を取得しないことを保証します (ただし、何千ものユーザーが毎分作業指示を入力しようとしているとしましょう。 )
2)テーブルをロックせず、次に使用可能な SiteWorkorderNum を取得してデータベースに挿入しようとします。一意の制約エラーが発生した場合は、エラーをキャッチして、成功するまで再試行します。(これにより、テーブルが解放されたままになる可能性がありますが、同じサイトに何千人ものユーザーがいると仮定すると、複数のデータベース呼び出しは少し効率が悪いでしょうか?)
これらのソリューションのいずれかがパフォーマンスにどのように影響するかについて、私は偏執的すぎますか? もちろん、何千人ものユーザーはいませんが、トラフィックの多いプロジェクトに取り組む場合に備えて、この設計にベスト プラクティスを適用したいと考えています。
mysql - テーブル ロックまたはトランザクションを使用する必要がありますか?
2 つのテーブルがあります。1 つは user と呼ばれ、ユーザーを格納し、もう 1 つは process と呼ばれ、ユーザーを更新するアクティブなプロセスのリストを格納します。
私がやりたいことは、50 人の古いユーザーを選択し、更新中のユーザー ID 範囲でプロセス テーブルにレコードを挿入してロックし、2 番目のプロセスが開始された場合にそれをロックできるようにすることです。同じユーザーの処理を開始しないでください。
総括する:
- プロセス テーブルで最後に処理された ID を選択します
- ユーザー テーブルで 50 の ID > 最後に処理された ID を選択します。
- 処理しようとしている ID 範囲の新しいレコードをプロセス テーブルに挿入します。
2 つのプロセス (P1 と P2) が同時に起動された場合、プロセスごとに 3 つのステップが連続して実行されるようにしたいと考えています。すなわち:
- P1 ステップ 1
- P1 ステップ 2
- P1 ステップ 3
- P2 ステップ 1
- P2 ステップ 2
- P2 ステップ 3
そしてそうではない
- P1 ステップ 1
- P2 ステップ 1
- P1 ステップ 2
- 等
どうすればいいですか?トランザクションまたはテーブル ロック? それとも何か他のものですか?
私のテーブルは InnoDB のものです。
ありがとうございました!
sql - SQL Server が UPDATE トランザクションを処理する方法
一意の数値キーを生成するために使用されるテーブルがあります。これらのキーは、他のテーブルで PrimaryKey として使用されます。テーブル構造は次のようになります。
したがって、このテーブルには次のようなデータがあります
したがって、テーブルの次の主キーが必要な場合は、このテーブルからCustomers
を取得します。これにより、400 が得られ、インクリメント (400+1) され、テーブル内のこのキーも更新されます。だから私たちは今401です。CurrentKey
TableName
Customers
CurrentKey
この目的で使用する sql は次のとおりです。
SQL1:
私の質問は、複数のユーザーが同時にこれを呼び出した場合にキーが重複しないように、テーブルをロックする必要がありますか? SQL Server はデータの重複を許可しないと確信していますが、その方法はわかりません... テーブル ロックを使用したクエリ:
SQL2
UPDATE
SQL Server が呼び出しを処理する方法を誰か説明してもらえますか?
mysql - SELECT ...FORUPDATE複数のスレッドの1つのテーブルから
SELECT FOR UPDATE
(またはLOCK IN SHARE MODE
)について少し助けが必要です。
約400000レコードのテーブルがあり、各行で2つの異なる処理関数を実行する必要があります。
テーブル構造は適切に次のとおりです。
関数は少し異なります:
- 最初の関数-すべてのレコードでループで実行する必要があり(かなり高速)、;に基づいてレコードを選択する必要があります
priority1
。セットdata1
とmtime
- 2番目の関数-各レコードで1回だけ実行する必要があり(かなり遅い)、;に基づいてレコードを選択する必要があります
priority2
。セットdata1
とmtime
同じ行を同時に変更するべきではありませんが、selectは両方で1つの行を返す可能性があり(priority1
値priority2
が異なります)、その場合はトランザクションが待機しても問題ありません(これが当てはまると思います)ブロックする唯一のケースです)。
次のクエリに基づいてデータを選択しています。
しかし、私が経験しているのは、毎回1つのクエリだけが返されるということです。
だから私の質問は:
- (同じテーブル内の)別々の行の束で2つの別々のトランザクションで2つの別々のロックを取得することは可能ですか?
- 最初のクエリと2番目のクエリの間にこれほど多くの衝突がありますか(デバッグに問題があります。デバッグ方法のヒントを
SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)
いただければ幸いです)。 ORDER BY ... LIMIT ...
問題を引き起こす可能性がありますか?- インデックスとキーは問題を引き起こす可能性がありますか?
mysql - テーブルに確実に挿入し、マルチ ユーザー システムで自動番号を取得する方法
次のような挿入ステートメントを実行するとします。
次に、挿入されたばかりの行の ID を取得して、別のテーブルで使用したいと考えています。select max() を使用できますが、他の誰も挿入を行っていないことをどのように確認できますか? テーブル全体をロックしてよかったと思います。コードがあまり頻繁に実行されないため、目立った違いはありません。多分私は衒学的です、しかし私は自分のコードが防弾であることを知って夜寝たいと思っています。
postgresql - plpgsql関数でのテーブルロック
次のことを行うplpgsql関数を作成したとしましょう。
最初の質問:
この関数を同時に2回呼び出した場合、の最初の呼び出しがまだ実行されている間に、の2番目の呼び出しでテーブルfoobar()
を削除することは可能ですか?tmp_foobar
foobar()
SELECT
ステートメントがロックを作成することを理解していACCESS SHARE
ますが、そのロックは、ステートメントが完了するまで、または関数の最後にSELECT
暗黙的に示されるまで持続しますか?COMMIT
2番目の質問:
後者が当てはまる場合、ロックが解除されるまで2回目の呼び出しをfoobar()
無期限に再試行DROP TABLE IF EXISTS tmp_foobar;
しますか、それともある時点で失敗しますか?
mysql - 大規模な UPDATE [...] SELECT FROM により、並列の UPDATE/DELETE が停止します
私の問題を例で説明しようとしています。私は次のような長期にわたる声明を持っています
このステートメントは大きなテーブルで実行されます (そのうちの 2 つにはテーブルごとに 700 万行以上が含まれます)。更新には 3 ~ 5 分かかります。別のセッションでは、高い並行性で行われます
また
ビッグランが発生するとUPDATE
、これらは同時に発生し、1 ~ 2 分後にロック待機タイムアウトまたはデッドロックで終了します。すべての列にインデックスが付けられます (標準インデックス)。私はすでにやろうとしましたUPDATE
DELETES
JOIN
しかし、それは役に立ちません。データ<table_A>
の整合性はそれほど重要ではありません ( <table_C>
...に存在しない行が含まれていても問題ありませ<table_E>
ん)。最も重要なことは、小さなUPDATE
/ DELETE
s on <table_C>
...<table_E>
が処理されていることです。
mysql - 単一のテーブル全体をロックしますが、MySQLの同じセッションで他のテーブルにアクセスできるようにします
セッションのためにMySQLで単一のテーブルをロックし、テーブルがまだロックされている間にそのテーブルをロックした同じセッション上の他のロックされていないテーブルで読み取りと書き込みを行うことは可能ですか?