問題タブ [database-deadlocks]
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 - マルチスレッドの一括削除クエリと一括挿入バッチでの SQL デッドロック
大量のファイルを読み取り、そのコンテンツを次の構造を持つ単一の MySQL InnoDB テーブルに格納する .NET のバッチがあります。
どこ
- idItem は外部キーです
- Source、Period、および idItem はインデックスです
- 組み合わせはユニークなインデックスです。
テーブルの更新を実行するために、次の 2 つのステップでトランザクションを実行します。
- 新しいデータセットの時間間隔内にある StartDate を持つすべての古い行を削除します。
1 つの INSERT ステートメントで新しい行を挿入します (最大 10,000 行)。
取引を開始します。
DELETE FROM data WHERE Source = @Source AND Period = @Period AND idItem = @idItem AND StartDate >= @FirstDate AND StartDate <= @LastDate;
INSERT INTO data(..,..,..,..) VALUES(..,..,..,..)(..,..,..,..)(..,.., ..,..)(..,..,..,..);
専念;
問題は、これを複数のスレッド (1 つのスレッドで正常に動作し、2 つ以上のスレッドで中断する) から同時に実行すると、各スレッドが ( Source,Period,idItem ) の異なるセットしか更新できない場合でも (重複しない) ことです。 )、1213 例外が発生します:ロックを取得しようとしたときにデッドロックが見つかりました。再起動してみてください。
この問題は、ここで説明されている問題と非常によく似ています:削除後の SQL デッドロックと一括挿入
この種のデッドロックを防ぐために何を提案しますか? ここで提案されているすべてを試しましたが、納得のいく結果は得られませんでした。ありがとう!
附属書:
mysql - 行が 2 つのパーティションに分割されることが原因でデータベースのデッドロックが発生する場合、パーティション化によってデータベースのデッドロックを防ぐことができますか?
テーブルの相互に排他的なサブセットで一括削除と挿入を実行しているため、本来あるべきではないデッドロックに苦しんでいます。それでも、クエリを複数のスレッド (それぞれが別のパーティションにあるデータにアクセスする) で実行する場合、デッドロックは避けられないようです。
問題の詳細については、この質問も参照してください。ただし、デッドロックに対処するためにパーティショニングが推奨されるかどうか、より一般的に言えば疑問に思っています。
mysql - 既に取得したロックでのMySqlデッドロック
私は困惑するデッドロックに遭遇しました。別の投稿Mysqlデッドロックの説明には、私の混乱を解決しない答えが必要でした。この状況は、 SHOW INNODB STATUSに関する別の参照された説明ページでも捉えられています。
インスタンスもアタッチしています。これは、インデックスをロックしているため、ギャップがある場合とない場合があるため、少し異なります。
しかし、主な質問はまだ同じだと思います:
トランザクション (2) がロックAを持っている場合、トランザクション (1) はロックAを待機しています。ロックAを再度要求すると、トランザクション (2) がデッドロックされる可能性がありますか?
これは正しくないように思えますが、それは InnoDb Status に表示されるものです。さまざまなトランザクションにさまざまなタブを使用して、MySql で直接再作成しようとすると、すべて正常に動作し、そのようなデッドロックは発生しません。また、無駄な再作成の試みを添付しています。
状況の解釈に何かが欠けている可能性があります。適切な説明をいただければ幸いです。
Hibernate 3でMySql 5.1を使用しています。
再作成を試みます(外部キーを持ついくつかの列を削除しました-InnoDbステータスで言及されていないため):
1) 初期設定:
2) トランザクション 2: おそらくトランザクション 2 の最初のロックを取得してトランザクションを開始します (私は GUI を使用します)。
3) トランザクション 1: トランザクションの開始 おそらくロックを待っています - ところで、トランザクションは待機します。
4) トランザクション 2: おそらく同じロックで再度待機しようとしています - ところで、これはまったく待機しません。
これで、トランザクション 2 をコミットでき、次にトランザクション 1 をコミットでき、すべて問題ありません...デッドロック状況の再現はありません..
sql - sql deadlocking and timing out almost constantly
looks like today is going to be another rubbish one. we have recently updated our sql box with a complete monster, with loads of cores and ram, however we are stuck with out old DB schema which is crapola our old sql box had problems but nothing like what we are experiencing with the new one, although on the day of rolling out it was running super fast, within a week its a complete mess...
our .net app used by a couple of hundred people or so is generating a huge amount of deadlocks and timeouts on the SQL box. and we are struggling to work out why. we have - checked all the indexes and they are as good as they can be right now some of the major tables are way too wide and have a stupid amount of triggers on, but there is nothing we can do about this now.
alot of the pids seem to be the same for the same users who are trying multiple times.. so for instance..
User: user1 Time: 09:21 Error Message: Transaction (Process ID 76) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
User: user1 Time: 09:22 Error Message: Transaction (Process ID 76) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
etc.. when we moved the db to the new box it was backed up from the old and restored to the new...
if anyone has any suggestions as to something we can do , i will buy them multiple pints
thanks
nat
sql - Firebirdトリガーデッドロック
私はデータベースの経験がほとんどなく、firebird2.5データベースでデッドロックを引き起こすトリガーの問題に遭遇しました。
データベースには2つのテーブルがあります。アイテムがITEMSテーブルに追加または削除されると、トリガーはSTATS.ITEMCOUNTおよびSTATS.SIZEを更新します。合計2つのインクリメントと2つのデクリメントの4つのトリガーがあります。
統計テーブルには1つの行があり、データベースの内容を追跡するために使用されます。私はこれを間違った方法でやっていますか?そうでない場合は、回避策があります。
デッドロックは、アプリケーションを開始してから最初の数分以内に発生します。
UPDATE1:すべてのトリガーを投稿しました。
UPDATE2:投稿されたExecuteNonQueryメソッド
UPDATE3: pilcrowによって親切に提案されたviewメソッドを使用している場合でも、デッドロックが発生します。実際、私は再びデッドロックしたストアドプロシージャを使用しようとしました。Firebird Adoプロバイダーは並列トランザクションをサポートしていないため、selectステートメントをトランザクションでラップすることも失敗しました。
データベース
**トリガー**
multithreading - コンピューターの限界に達していますか?
ThreadPool.SetMinThreads()
私は、999 項目の同時辞書を作成し、メソッドを使用して 50 のスレッドを起動する単純なアプリケーションを作成しました。次に、999 個の辞書エントリをループ処理し、データベース内のレコードを更新して、エントリが処理されたことを示すフラグを立てます。
アプリケーションを実行すると、スレッドが開始されたことを確認できます。その後、SQL クエリを実行して、レコードが更新されていることを確認できます。これまでのところ、これらはすべてかなりうまく機能しています。初期スレッドのいくつかが終了すると、スレッドの次のバッチが開始されます (これはまさに私がやりたいことです)。データベース内のレコードがまだ更新されていることを確認でき、アプリケーションが期待どおりに動作していることがわかります。新しいスレッドが作成されているのをまだ確認できますが、デッドロックが発生します。デッドロックを見ると、開始された最初の 50 スレッドの 1 つからのものです。これが私の質問の出番です。
6Gb RAM を搭載した 3Ghz デュアル コア プロセッサでアプリケーションを実行しています。私の SQL Server インスタンスも同じマシンで実行されていますが、これが問題になるとは思いもしませんでした。アプリは概念実証ですが、開発環境で 50 スレッドを実行できないことは有望に見えません。実稼働環境では、アプリケーションと同様に、SQL インスタンスが別のマシン上にあることを私は知っています。何か案は?
oracle - Oracle でのデッドロックの歴史?
オラクルはデッドロックに関する履歴を保持していますか?
たとえば、デッドロックが検出され、Oracle 例外 ORA-00060 (リソースの待機中にデッドロックが検出された) がスローされたときに実行された SQL を知ることはできますか?
前もって感謝します。
sql-server-2008 - この SQL Server デッドロックが発生するのはなぜですか? T1222 デッドロック トレースを含む
デッドロックが発生していますが、その理由がわかりません。メッセージの最後に T1222 トレースがあります。これが起こっていることです:
複数のコンピューターが同じことをしている場合、以下に報告されているデッドロックが発生することがあります。私が得られないのは、これが単なる読み取りクエリであり、私の知る限り、誰もそのテーブルにデータを挿入していない場合、 SELECT TOP 1 @ENVIRONMENT = ENVIRONMENTDBOID でデッドロックが発生する方法です。
デッドロック レポート:
sql-server - SQL Azureでデッドロックを特定するにはどうすればよいですか?
2つのインスタンスで構成されるWindowsAzureの役割があります。時々、トランザクションはSqlException
次のテキストで失敗します
トランザクション(プロセスID N)は、別のプロセスとのロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
今、私はしばらくの間グーグルで検索し、SQLServerログを使用してデッドロックを特定することについてのこの投稿を読みました。
問題は...
SQL Azureでそれを行うにはどうすればよいですか?SQL Azureの内部にアクセスし、十分なデータを取得するためにどのツールを使用しますか?