問題タブ [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 の UPDATE クエリ
21M レコードの MySQL データベースがあり、約 1M レコードを更新しようとしていますが、クエリが失敗します。ERROR 1206 (HY000): The total number of locks exceeds the lock table size.
ロックを取得せずにテーブルを更新することはできますか?
などの MySQL 構成パラメーターを変更するアクセス権がありませんinnodb_buffer_pool_size
。同じことを達成する別の方法はありますか?
ありがとう
編集:
- 5000回のバッチで試しましたが、数回は機能しますが、同じエラーが発生します
- LOCK TABLES を使用してテーブル全体をロックしようとしましたが、まだ機能しません。
php - PHPがクラッシュした後にmysqlテーブルがロックされました
MySQLDBとinnoDBテーブルがあります。接続し、テーブルをロックし、いくつかの更新を行ってから、テーブルのロックを解除するphpページがあります。PHPページは、Wampを介してApacheで提供されています。
phpページはファイルをデータベースにアップロードします。PHPに割り当てられているメモリよりも大きいサイズのファイルをアップロードして、システムのクラッシュをシミュレートすることにしました。これは間違いなくこのエラーを引き起こしました:18874368バイトの許可されたメモリサイズが使い果たされました(6176754バイトを割り当てようとしました)。その後、更新中にロックされていたテーブルは引き続きロックされます。
このエラーの後にテーブルにアクセスしようとすると、次のエラーが発生します。テーブル'a'はLOCKTABLESでロックされていません。SQLプロンプトを表示して、ロックされたテーブルから選択しようとするため、ロックの問題であることがわかっています。テーブルがロックされている場合とまったく同じように、待機します。その後、Apacheプロセスを強制終了すると、SQLプロンプトで実行しようとしたステートメントが最終的に実行されます。私の推測では、Apacheプロセスを強制終了すると、MySQLは、接続が切断されたためにテーブルロックを解放する必要があることを認識します。
何か案は??
oracle - Oracle Data Pump Export(expdp)ロックテーブル(または同様のもの)
常にオンラインである必要があるグローバルインデックスを持つパーティションテーブルからデータをエクスポートする必要がありますが、それを行うのに問題があります。データのエクスポートには、Data Pump Export --expdpを使用しており、1つのパーティションのみをエクスポートしています。アクティブなものではなく、最も古いもの。
私のexpdpコマンドは正しいデータをエクスポートし、次のようになります。
データベースを使用するアプリケーションの接続タイムアウトは10秒です。このパラメーターは変更できません。INSERTクエリが10秒以内に終了しない場合、データはバックアップファイルに書き込まれます。
私の問題は、数分間続くエクスポートプロセス中に、一部のデータがデータベースではなくバックアップファイルに保存されることです。理由を知りたいのですが、避けたいです。
パーティションは毎週整理されており、4つのパーティションをアクティブにしています(過去4週間)。すべてのパーティションは最大3GBです。
Oracle11.2を使用しています
sql-server - Microsoft SQL Server でテーブルを明示的にロックする方法 (ハックを探す - 非協力的なクライアント)
これは私の最初の質問でした:
SQL Server で EXCLUSIVE テーブル ロックを強制する方法を見つけようとしています。ISOLATION LEVEL を READ UNCOMMITTED に明示的に設定する非協力的なリーダー (私の制御の及ばない、クローズド ソースのもの) を回避する必要があります。その結果、挿入/更新中に指定したロックの数と分離の種類に関係なく、クライアントは適切な分離を設定するだけで、進行中のガベージの読み取りに戻ります。
答えは非常に単純であることが判明しました-
明示的なロックをトリガーする方法はありませんが、DDL を変更すると、探していたロックがトリガーされます。
この状況は理想的ではありませんが (反復可能な読み取りを監視する代わりにクライアントがブロックします)、クライアントに分離をオーバーライドさせてダーティ データを読み取らせるよりははるかに優れています。ダミー トリガー ロック メカニズムを使用した完全なコード例を次に示します。
勝った!
結果:
sql - ストアド プロシージャが呼び出されたときにテーブルが挿入のためにロックされるのはいつですか
レポート目的で使用されるテーブルがあり、ユーザーが Web からレポートを実行するたびにデータが挿入されます。挿入は、レポートのパラメーターに応じて、1 行から数千行までさまざまです。挿入に使用される select ステートメントは、挿入のために最大 60 秒間実行できます。最適化されていますが、データベースが複雑なため、さらに調整することはできません。私の質問は - テーブルが挿入のためにロックされるのはいつですか? ストアド プロシージャが呼び出されたとき、select ステートメントが実行されたとき、または select ステートメントの実行が終了したときですか? 最大 50,000 行の大きなレポートを実行するときに、他のユーザーが影響を受けないように、テーブルがロックされる時間を制限したいと考えています。
元。
ありがとうございました
mysql - 別のテーブルでのカウントクエリを使用したMySQLの選択
私は3つのテーブルを持つ単純な記事アプリケーションを持っています:
ランディングページに、最新の記事タイトルを著者名と記事の総コメント数とともに表示したい。主な問題は、記事のコメントの総数を取得する方法ですが、正しく取得できませんでした。次の出力が得られるはずです。
私の実際のアプリケーションでは、記事へのコメントの合計数の列を記事テーブルに追加しました。この列は、新しいコメントがシステムに追加されると更新されます。これに関する問題は、新しいコメントが追加されると article テーブルがロックされることです。私のアプリケーションでは、毎分多くのコメントが追加されます。そのため、SQLクエリを書き直して article テーブルをロックしないようにしています。
テスト用のデータを次に示します。
mysql - MySQL テーブルのロック: ホルダーの読み取りと書き込み、他のセッションは読み取りのみ?
所有者が読み書きできるようにテーブルをロックし、他のセッションは読み取りしかできないようにすることは可能ですか?
ドキュメントは、読み取りロックでは全員が読み取りのみを許可し、書き込みロックでは所有者のみが読み取りと書き込みを許可され、他のセッションはアクセスできないことを示唆しているようです。所有者に読み書きを許可し、他のセッションに読み取りのみを許可することは、かなり頻繁に必要とされる動作であり、おそらく最も頻繁に必要とされる動作です。
このシナリオを実装すると、パフォーマンス ヒットが大きすぎるのではないでしょうか?
php - PHP 用データベース中立テーブル ロック ライブラリ
すべてのアクティビティ (読み取りと書き込み) に対してテーブルをロックする必要があると思われるシナリオがあります。私は Propel 1.6.x を使用しており、ロックを処理するための小さな追加ライブラリを作成するつもりです。
私の使用例は、(id、作成者、バージョン) の主キーを持つバージョン テーブルです。列のペア (id、作成者) は、実際には別のテーブルの PK です。新しい行が挿入されると、MAX(バージョン) が PHP コードで読み取られ、後で保存するために行クラスに挿入されます。最大値と保存の間に、別のプロセスが同じ最大値を取得する可能性のある競合状態があり、もちろん、一意性がないために挿入の 1 つが失敗します。
ロックの必要性を避けるために、次のような保存にサブセレクトを使用することをお勧めします。
しかし、これは Propel ではサポートされておらず、PDO を介して行う場合、複合 PK の「バージョン」部分に与えられた値を発見する方法がありません (私の知る限り)。
自動インクリメントされた値は、行を検索するために挿入後に読み取られるため、Propel で再選択を行うことができます。しかし、できれば不要な列は避けたいと思います - 私の意見ではエレガントではないようです。
だから...私の気持ちは、max&save呼び出しをロックでラップすることが道だと思います。これは、テーブル IMO 全体をロックし、読み取りと書き込みを防ぐ必要があります (そうしないと、後続の max 呼び出しが待機せず、非一意性エラーが再び発生する可能性があります)。
Propel でサポートされているすべてのプラットフォームで動作するためにこれが必要です。より良いアプローチがない限り、PDO データベースに対してこのロックを行う PHP ライブラリはありますか? そうでない場合は、自分で行うことができます-しかし、他の誰かがさまざまなデータベースに対してドンキーワークのテストを行っているといいです(MSSQLサーバーをセットアップしますか?-いいえ:)
sql-server-2008 - SQL Server 2008 ストアド プロシージャを同時に実行すると遅延が発生する
同じアプリケーションの 2 つの異なるインスタンスから同じストアド プロシージャを同時に実行するとタイムアウトするように見える問題があり、それを解決するために何かできることはないかと考えました。
問題は、SQL Server 2008 がそれ自体を処理し、行をロックし、SP を実行する方法にあると思います。アプリはADODB.Command
SP の実行に使用します。
App.exe
1つのサーバー上で複数回実行されている 1 つの VB6 exe ( ) があります。このアプリは、そのアプリの次のシーケンス番号を返すデータベースのストアド プロシージャを呼び出します。tbl_SequenceNos
このシーケンス番号フィールドは、アプリケーションのインスタンスに対して一意です。実行中のアプリケーションのインスタンスごとに、表 ( ) に 1 つの行があります。
たとえば、running:App[a].exe
とApp[b].exe
tblSequenceNos
次のようになります。
次のシーケンス番号を取得するためのストアド プロシージャは比較的単純です。
と の両方が値を取得するためにこの手順を実行しようとするとApp[a].exe
、約 30 秒間ハングします (ADO タイムアウト?)。App[b].exe
NextSequenceNo
各アプリはお互いの行を見ることがないので、特別な Locking を指定しなくても、これは同時に動作すると考えました。足りないものはありますか?テーブル全体やページではなく、行のみをロックするように指定する必要があるのではないかと思いましたか? - sql2008 のデフォルトの動作がわかりません。
どんな助けでも大歓迎です!前もってありがとう アンドリュー
sql-server - トリガーをドロップして作成するためにテーブルが利用可能かどうかを確認する方法は?
SQL Server 2000 に長いスクリプトがあります (17,000 行以上)。
問題は、約半分のいくつかのトリガーを削除して、リモート インストール手順の一部として再作成する必要があることです。
1 つまたは 2 つのテーブルが使用中で、メッセージ タブを調べて見つけるまで、警告なしにインストールが停止することがあります。
半無人インストールを希望しており、少なくとも 2 つのオプションがあります。
a) 悲観的なアプローチ: 最初にすべてのテーブルの可用性を確認し、いくつかのテーブルが使用されている場合は、警告 + 「set exec off」を表示します (開始からトリガー作成までの間に使用される可能性はほとんどありません)。
b) 楽観的なアプローチ: 一部のテーブルが使用されているときに最初に警告を表示し、インストールを続行できるかどうかは私に任せて、set exec off/on コードで問題のトリガーをカプセル化します。トリガーコードは非常に安定している傾向があるため(数年前)、私はこれを行うことができます
とにかく、プロセスを停止せずにテーブルがトリガーの削除/作成に使用できるかどうかを知る必要があります (テーブルのロック?)。BOL といくつかのフォーラムにログインしましたが、何を探すべきか本当にわかりません。
更新:
この選択を使用して、Type_Id & Mode_Id & Sts_Id の値を見つけます...
(私のものはそれぞれ 5、6、1 ですが、他の可能性もあります。これらは初期テストからのものです)
%%%警告: MS が変更または変更できることを覚えておいてくださいこれは最善の方法ではないため、非推奨にしますが、今まで見つけた唯一の方法です...