問題タブ [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.

0 投票する
1 に答える
873 参照

mysql - SELECT を使用した UPDATE、各行またはすべての SELECT レコードをロックしますか

次のクエリが MySQL 5.1 の INNODB テーブルで実行された場合、db が内部的に更新する各行 (合計で 5000) に対して WRITE LOCK を作成するか、バッチ内のすべての行をロックするかは、(MySQL のドキュメントを読んでも) 私にはわかりません。データベースの負荷が非常に高いため、これは非常に重要です。

行ごとにあると思いますが、そうであることを確認する方法がわからないため、詳しい知識のある人に尋ねることにしました。これが当てはまらず、データベースがセット内のすべての行をロックする場合は、その理由を説明していただければ幸いです。

0 投票する
5 に答える
10965 参照

mysql - まだ存在しない InnoDB 行をロックするにはどうすればよいですか?

ユーザー名がデータベースに存在するかどうかを検索し、そのユーザー名を新しい行としてデータベースに挿入できることを保証するにはどうすればよいSELECTですINSERTか?

あたかも存在しない行をロックしているかのようです。ユーザー名"Foo"で存在しない行をロックしたいので、データベースに存在するかどうかを確認し、存在しない場合は中断することなくデータベースに挿入できます。

私は使用LOCK IN SHARE MODEしてFOR UPDATE存在することを知っていますが、私が知る限り、それはすでに存在する行でのみ機能します。この状況で何をすべきかわかりません。

0 投票する
1 に答える
1061 参照

oracle - oracle:(他の行のロックを保持しながら)単一行のロックを解除しますか?

Oracle では、(単一のデータベース接続で) 次のことが可能です。

  1. 単一の行 (row1) をロックします
  2. 次に、別の行 (row2) をロックします。
  3. 行 1 のロックを解放します (行 2 のロックを保持します)
  4. 別の行 (row3) のロックを取得する
  5. 行 2 のロックを解放します (行 3 のロックを保持します)
  6. 行3のロックを解放します

オラクルはさまざまな種類のロックをサポートしていることを認識しています(これは非常に役立つことがわかりました:http://broadh2o.net/docs/database/oracle/oracleLocks.html)ので、おそらく答えは選択されたロックの種類によって異なります。排他ロック、つまり、他の接続が行を更新するのを防ぐロックに興味があります。

単一のデータベース接続を使用して操作 1 ~ 6 を実行できるかどうかを知りたいです。行ごとに個別のデータベース接続を使用できます。ロックは COMMIT/ROLLBACK を使用して解放されるようです。そのため、単一の行でロックを解放することは不可能です。

0 投票する
1 に答える
166 参照

mysql - データロックによりクエリの実行が妨げられる - MySQL InnoDB

1 つの大きなログ テーブルからデータの合計と平均を計算し、常に多くの選択/更新クエリを持つ Main_Table (Innodb) のデータを更新するスクリプトを 24 時間ごとに実行する必要があります (毎秒約 1 回)。

約 10 分かかったローカル DB でテスト クエリを実行しました。

そして、これは Main_Table のすべての行を更新するため、テーブルのロッキングのためにすべてがライブ プロジェクトで動かなくなると思います - これが再び適切に機能するようにするには、クエリのプロセスを強制終了する必要がありました - データは更新されませんでした。

私はいくつかの掘り下げを行い、次の3つのオプションを検討しています。

  1. 一時テーブル内のすべてのデータを更新してから、何らかの方法で Main_Table にマージします。
  2. 1 つの MySql クエリではなく、php ループでスクリプトを実行します (時間がかかりますが、一度に 1 行ずつ更新します)。
  3. これが私たちの問題に関係しているかどうかはわかりませんが、「START TRANSACTION... etc」について何か読んだことがあります。

誰かがこれに光を当てて私たちを助けてくれることを願っています. ありがとう

0 投票する
2 に答える
2705 参照

multithreading - Oracle 行の競合により、高スループット JMS アプリケーションでデッドロック エラーが発生する

概要:

同じ行を更新しようとして大量のメッセージが発生し、Oracle デッドロック エラーが発生する高スループット アプリケーションのベスト プラクティスを知りたいです。これらのエラーを回避できないことはわかっていますが、何度も何度も発生するデッドロック エラーによって行き詰まることなく、どのようにして正常に回復するのでしょうか。

詳細:

高スループットの JMS メッセージング アプリケーションを構築しています。本番環境は、2 つの weblogic 11g ノード (それぞれ 6 つの MDB リスナー インスタンスを実行) になります。Oracle データベースで同じ行を更新しようとする約 1000 のメッセージを取得すると、Oracle デッドロック エラー (ORA-00060) が発生していました。ノード間の Java 同期は、標準の Java スレッド API では不可能です (テラコッタなどのサードパーティ ソリューションを使用したくない他のソリューションがない場合を除きます)。

Oracleの「select for update WAIT n secs」ステートメントが役立つことを期待していました。これにより、競合するスレッド(同じ行の)が最初のスレッド(最初に行のロックを取得したスレッド)が処理されるまで数秒待機するようになるためです。 .

「SELECT FOR UPDATE WAIT n」の最初の問題は、待機時間にミリ秒を使用できないことです。これは、アプリケーションのスループットに悪影響を及ぼし始めます。これは、1 秒の WAIT (最小待機時間) を設定するとメッセージの遅延が発生するためです。

次に、weblogic キューの再配信遅延パラメーター (この場合は 30 秒) をいじっています。デッドロック エラーが原因でスレッドが跳ね返るたびに、再試行されるまで 30 秒待機します。

私たちの経験では、1000 件の競合するメッセージがあり、デッドロックが何度も発生し続けるため、多くの状況で処理に永遠に時間がかかります。

現在のアーキテクチャでは、(1000 件の競合するメッセージの場合) 関係なくデッドロック エラーが発生するはずですが、アプリケーションは、ループ メッセージを再試行した後にこれらのエラーから回復するのに十分な回復力を備えている必要があることを理解しています。

ここで何が欠けているか分かりますか? 以前に同様の問題に対処したことがある人はいますか?

このデッドロック状態から回復し、追加のハードウェアをあまり使用せずに適切な時間内にすべてのメッセージを最終的に処理できるように、これを弾力的に機能させることができる設計のアイデアを探しています。

計算の詳細: これらの 1000 のメッセージは、それぞれに関連付けられた数量を持つ 4 つの異なるポジション タイプの 4 つのオブジェクトを作成します。これらの数量は、(ポジション タイプに応じて) 4 つの異なるスロットに統合する必要があります。これらの 4 つの個別のスロットが個別のスレッドによって更新されているときに、デッドロックが発生しています。競合状態を回避するために、データベース行に適用される前に、これらの個々の更新を特定の順序で並べ替えています。

0 投票する
1 に答える
432 参照

sybase - Sybase は、iSQL を使用して WriteNoPK で行を読み取ります

私はSybase SQL Anywhere 12を使用しています。次の接続を持つテーブルユーザーがいるとしましょう:

ここで、Sybase SQL Anywhere 内からSELECT * FROM userを実行すると、期待どおりにすべての行とデータが取得されます。

しかし、OpenSuse 11.4 の iSQL で DBA ユーザーを使用して同じ SQL ステートメントを起動すると、ステートメントが実行され、選択される行に WriteNoPK-Lockflag が設定されるまで結果が返されます。声明は、次のエラーを示しています。

サーバー メッセージ番号 = 8405 重大度 = 21 状態 = 0 行 = 0 テキスト = SQL Anywhere エラー -210: ユーザー 'XYZ' はロックされた 'user' のローを持っています、SQL: 'SELECT * FROM user'

行が WriteNoPK-Locked の場合でも読み取り/選択する可能性はありますか?

どうもありがとう、マックス

0 投票する
0 に答える
184 参照

oracle9i - Oracle 9i データベース - ORA-00054 RESOURCE BUSY

アドバイスを探しています。昨日、同僚が Toad を介して Oracle 9i データベースの行を更新しようとしました。Toad が応答なしとしてハングしたため、彼女はタスク マネージャーで Toad を殺しました。ここで、行を更新しようとすると、ORA-00054: リソースがビジーで、NOWAIT が指定された状態で取得されます。その後切断された VPN 接続を使用してデータベースにアクセスします。私は DBA ではありませんが、オラクルはしばらくすると古いセッションやロックをクリーンアップすると思いましたか? これを修正する方法はありますか、または DBA に連絡して確認する必要がありますか?