問題タブ [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.
sql - Sybase ASE: 「サーバー コマンドでデッドロック状態が発生しました」
INSERT と UPDATE を行うストアド プロシージャを (.NET アプリケーションから) 実行すると、ときどき (実際にはそれほど頻繁ではありません)、ランダムに次のエラーが発生します。
ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server] サーバー コマンド (ファミリ ID #0、プロセス ID #46) でデッドロック状態が発生しました。コマンドを再実行してください。
どうすればこれを修正できますか?
ありがとう。
sql - INSERT ステートメントのデッドロック エラー
Web ベースのアプリケーションがあります。アプリケーションには時間制限のあるデータベース操作 (INSERT および UPDATE) があり、完了するまでにより多くの時間がかかります。そのため、この特定のフローは Java スレッドに変更され、完全なデータベース操作が完了するまで待機 (ブロック) しません。
私の問題は、複数のユーザーがこの特定のフローに遭遇した場合、PostgreSQL によってスローされる次のエラーに直面していることです。
上記のエラーは、INSERT ステートメントで一貫してスローされます。
追加情報: 1) このテーブルに PRIMARY KEY が定義されています。2) この表には FOREIGN KEY 参照があります。3) 個別のデータベース接続が各 Java スレッドに渡されます。
テクノロジー Web サーバー: Tomcat v6.0.10 Java v1.6.0 サーブレット データベース: PostgreSQL v8.2.3 接続管理: pgpool II
java - マルチスレッド - データベースのデッドロックの回避と対処
Java 6 アプリケーション内からデータベースのデッドロックを処理するための優れた戦略を探しています。複数の並列スレッドが同時に同じテーブルに書き込む可能性があります。データベース (Ingres RDMBS) は、デッドロックを検出すると、セッションの 1 つをランダムに強制終了します。
次の要件が与えられた場合、デッドロック状況に対処するための受け入れ可能な手法は何でしょうか?
- 合計経過時間は、合理的に可能な限り短く保つ必要があります
- セッションを強制終了すると、重大な (測定可能な) ロールバックが発生します
- スレッドが
互いに通信する方法がない場合、つまり、戦略は自律的でなければなりません
これまでのところ、私が思いついた戦略は次のようなものです。
何らかの方法で改善できますか?たとえば、一定量 (マジック数) 秒待機します。より良い結果を生み出す別の戦略はありますか?
注:デッドロックが実際には非常にまれであることを確認するために、いくつかのデータベース レベルの手法が使用されます。また、アプリケーションは、同時に同じテーブルに書き込むスレッドをスケジュールすることを回避しようとします。上記の状況は、あくまでも「最悪のシナリオ」になります。
注:レコードが挿入されるテーブルは、ヒープ パーティション テーブルとして編成され、インデックスはありません。各スレッドは、独自のパーティションにレコードを挿入します。
mysql - すでに付与されているロックを待機しているMysqlトランザクション..これによりデッドロックが発生しています
次の状況の場合、mysqlのバグ?
Mysqlバージョン:mysql.x86_64 5.0.77-4.el5_4.1
カーネル:Linux box2 2.6.18-128.el5#1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU / Linux
sql - SQL 2008 SP - デッドロックの原因または赤ニシン?
One of my co-workers has a stored procedure that does the following
Begin tran
1) Dynamically generate a select statement.
2) Insert into table x
3) Execute the select statement
End tran
If this stored procedure is ran by two septate threads simultaneously, he gets the following error: System.Data.SqlClient.SqlException: Transaction (Process ID 57) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction
Is this stored procedure really the issue? From my naive mind, this looks to be at worse a race condition, not a deadlock.
sql-server - SQL Server デッドロックの修正: 結合順序を強制するか、自動的に再試行しますか?
TableB
toの結合を実行するストアド プロシージャがありますTableA
。
同時に、トランザクションでは、行が に挿入されTableA
、次に に挿入されTableB
ます。
この状況は、ストアド プロシージャ select が TableB から行を取得し、insert がTableAに行を追加し、それぞれが他のテーブルを手放すことを望んでいるため、デッドロックを引き起こすことがあります。
ロジックでは、INSERT
最初に行をAに追加してからBに追加する必要がありますが、個人的には、SQL Server が結合を実行する順序は気にしません。
デッドロックを修正するための一般的な推奨事項は、全員が同じ順序でリソースにアクセスできるようにすることです。しかし、この場合、SQL Server のオプティマイザは、逆の順序が「より良い」と言っています。別の結合順序を強制して、クエリのパフォーマンスを低下させることができます。
しかし、私はすべきですか?
使用したい結合順序で、オプティマイザーを今も永遠にオーバーライドする必要がありますか?
または、エラーネイティブ エラー 1205をトラップして、選択ステートメントを再送信する必要がありますか?
問題は、オプティマイザーをオーバーライドして、最適でないことを行うと、クエリのパフォーマンスがどれほど低下するかということではありません。問題は、より悪いクエリを実行するよりも、自動的に再試行する方がよいかどうかです。
mysql - MySQL エラー「ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してください」の回避策
DBIを介して接続する並列Perlプロセスによって小さな方法で絶えず更新されている約5,000,000行のMySQLテーブルがあります。テーブルには、約 10 の列といくつかのインデックスがあります。
1 つのかなり一般的な操作で、次のエラーが発生することがあります。
エラーをトリガーする SQL ステートメントは次のようなものです。
エラーはたまにしか発生しません。コールの 1% 以下で見積もっています。ただし、小さなテーブルでは発生せず、データベースが大きくなるにつれてより一般的になりました.
file_table の a_lock フィールドを使用して、実行中の 4 つのほぼ同一のプロセスが同じ行で試行および動作しないようにしていることに注意してください。制限は、作業を小さなチャンクに分割するように設計されています。
MySQL や DBD::mysql のチューニングはあまり行っていません。MySQL は標準の Solaris デプロイメントであり、データベース接続は次のように設定されています。
他の何人かが同様のエラーを報告しており、これが本当のデッドロック状況である可能性があることをオンラインで見ました。
2 つの質問があります。
上記のエラーの原因は、私の状況について正確には何ですか?
それを回避したり、頻度を減らす簡単な方法はありますか? たとえば、「Db.pm 行 276 でトランザクションを再開する」にはどうすればよいですか?
前もって感謝します。
database - データベースのデッドロックとは何ですか?
SQL Server のデッドロックとは何ですか? また、いつ発生するのですか?
デッドロックの問題とその解決方法
oracle - Oracle ITLデッドロックの特定と解決
ITL (Interested Transaction List) デッドロックと思われるものを日常的に引き起こしている Oracle DB パッケージがあります。トレース ファイルの関連部分を以下に示します。
このテーブルにはビットマップ インデックスがないため、それが原因ではありません。私が知る限り、「待機中の行」と待機列の「S」がないことは、これが ITL デッドロックであることを示している可能性があります。また、テーブルは頻繁に書き込まれるため (約 8 つの挿入または更新が同時に行われ、1 分間に 240 回も行われる)、ITL デッドロックが発生する可能性が高いようです。
テーブルの INITRANS パラメータとそのインデックスを 100 に増やし、テーブルの PCT_FREE を 10 から 20 に増やしました (その後、インデックスを再構築しました) が、デッドロックはまだ発生しています。デッドロックは更新中に最も頻繁に発生するようですが、それは偶然かもしれません。私はそれを数回追跡しただけです.
私の質問は 2 つあります
。1) これは実際に ITL デッドロックですか?
2) ITL デッドロックの場合、それを回避するために他に何ができますか?
これは ITL デッドロックの問題ではなく、インデックスのない外部キーの問題であることが判明しました。dpbradley の回答のおかげでこれを発見しました。これにより、ITL の問題ではないという事実がわかり、「行がない」デッドロックの他の原因が何であるかを調べるようになりました。
sql - MySQL でデッドロックが発生する
MySQL でデッドロックが発生し、非常にイライラしています。デッドロックが発生すると即座に発生するため、ロックのタイムアウトを超えたことが原因ではありません。デッドロックを生成する 2 つの別個のスレッド (接続プールからの 2 つの別個の接続) で実行されている SQL コードを次に示します。
Sequences テーブルには、Sequence と Counter の 2 つの列があります。
LAST_INSERT_ID により、MySQL の推奨に従って、この更新されたカウンター値を取得できます。それは私たちにとって完璧に機能しますが、これらのデッドロックが発生します! なぜそれらを取得しているのか、どうすれば回避できるのでしょうか??
これについて何か助けてくれてありがとう。
EDIT:これはすべてトランザクション内にあり(Hibernateを使用しているため必要です)、AUTO_INCREMENTはここでは意味がありません。もっとはっきり言うべきだった。Sequences テーブルには、多くのシーケンスが保持されます (この例では約 1 億個)。カウンターをインクリメントして、その値を取得する必要があります。AUTO_INCREMENT は、これらすべてにおいて何の役割も果たしません。これは、ID や PRIMARY KEY とは何の関係もありません。