タグ付けされた質問 「locking」

ロックを要求するプロセスに一時的に排他的なアクセスを許可することにより、共有データまたはリソースへの同時アクセスを管理するメカニズム。


3
行ロック競合のトレース、デバッグ、修正
遅くなって、私は多くの行ロックの競合に直面しました。競合するテーブルは特定のテーブルのようです。 これは一般的に何が起こるかです- 開発者1は、Oracle Formsのフロントエンド画面からトランザクションを開始します 開発者2は、同じ画面を使用して別のセッションから別のトランザクションを開始します 〜5分で、フロントエンドが応答しなくなったようです。セッションをチェックすると、行ロックの競合が示されます。誰もが投げる「解決策」は、セッションを終了することです:/ データベース開発者として 行ロックの競合を排除するために何ができますか? ストアドプロシージャのどの行がこれらの行ロックの競合を引き起こしているかを調べることは可能でしょうか このようなコーディングの問題を軽減/回避/排除するための一般的なガイドラインは何でしょうか? この質問が無制限で不十分な情報であると感じた場合は、気軽に編集してください。 問題のテーブルには多くの挿入と更新が行われています。最も忙しいテーブルの1つだと思います。SPはかなり複雑です-簡単にするために-さまざまなテーブルからデータをフェッチし、それを作業テーブルに取り込みます。作業テーブルで多くの算術演算が行われ、作業テーブルの結果が問題のテーブルに挿入/更新されます。 データベースのバージョンは、Oracle Database 10g Enterprise Editionリリース10.2.0.1.0-64ビットです。ロジックのフローは両方のセッションで同じ順序で実行され、トランザクションは長時間(または少なくともそうだと思われます)開いたままにならず、トランザクションのアクティブな実行中にロックが発生します。 更新:テーブルの行数は予想よりも大きく、約310万行です。また、セッションをトレースした後、このテーブルに対するいくつかの更新ステートメントがインデックスを使用していないことがわかりました。なぜそうなのか-よくわかりません。where句で参照される列にはインデックスが付けられます。現在、インデックスを再構築しています。

2
MySQLに楽観的ロックを正しく実装する方法
MySQLで楽観的ロックを正しく実装するにはどうすればよいですか? 私たちのチームは、以下の#4を実行する必要があると推定しました。そうしないと、別のスレッドが同じバージョンのレコードを更新できるリスクがありますが、これが最善の方法であることを検証したいと考えています。 楽観的ロックを使用するテーブルにバージョンフィールドを作成します(例:列名= "version") 選択時には、必ずバージョン列を含めてバージョンをメモしてください その後のレコードの更新時に、更新ステートメントは「where version = X」を発行する必要があります。ここで、Xは#2で受け取ったバージョンであり、その更新ステートメント中のバージョンフィールドをX + 1に設定します。 実行しSELECT FOR UPDATE、我々は、更新しようとしているレコードに変更を加えることができる人シリアライズように、我々は、更新しようとしている記録に。 明確にするために、同じバージョンのレコードを取得する同じタイムウィンドウで同じレコードを選択する2つのスレッドが、レコードを同時に更新しようとした場合に、お互いに上書きされないようにします。#4を行わない限り、両方のスレッドが同時にそれぞれのトランザクションに入る場合(ただし、まだ更新を発行していない場合)、更新に行くときに、UPDATEを使用する2番目のスレッドが可能性があると考えています...バージョン= Xは古いデータで動作します。 バージョンフィールド/楽観的ロックを使用している場合でも、更新時にこの悲観的ロックを実行する必要があると私たちは考えていますか?
12 mysql  locking 

1
mysqlのスロークエリログ内の「ロック時間」をどのように解釈すればよいですか?
MySQLのスロークエリログに表示されるクエリのロック時間を最適に解釈する方法を理解しようとしています。 たとえば、UPDATEクエリのロック時間が10秒の場合です。更新クエリがロックを取得してからの合計時間だと思います。以前の選択クエリが完了するのを待っているがUPDATEアクション自体を実行していない場合でも、UPDATEクエリの後に並んでいるすべてのSELECTクエリをロックしているので、時計が動いているはずです。 そして、SELECTクエリのロックについてはどうでしょう。一部の選択クエリにロック時間があるのはなぜですか?UPDATEクエリがフォローアップしているため、テーブルをロックしています。
12 mysql  locking 

2
SELECT…WITH XLOCKを使用する理由は何ですか?
私はいくつかの再発するデッドロックに直面しています。そのうちの1つはキーロックであり、デッドロックの犠牲になるXLOCKヒントを含むSELECTクエリが含まれています。もう1つのステートメントは、最初のクエリのビューの一部であるテーブルの1つへのINSERTです。 見る: create view dbo.viewE as select * from dbo.E where myValue > 13000 クエリを選択: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERTステートメント: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基になるテーブルdbo.Eは、約20列に約300万行を保持しています。それらの一部はntextです。 クエリを取り出し、2つのトランザクションで手動でシミュレーションすると、動作は再現可能です。XLOCKが選択から削除されると、動作が変わります。 デッドロックグラフ: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

1
大量のデータを含む既存のテーブルにインデックスを追加するとどうなりますか?
約1500万件のレコードを含むテーブルがあります。次に、テーブルにインデックスを追加する必要があります。 インデックスを追加すると、テーブルのすべてのエントリが更新されるまでに時間がかかります。 インデックスを追加するとダウンタイムが発生するかどうか、私はかなり混乱しています。 はいの場合、どのようにしてダウンタイムを克服できますか?

1
PostgresでのUPDATE / INSERTの組み合わせのロック
テーブルが2つあります。1つはログテーブルです。もう1つには、基本的に1回しか使用できないクーポンコードが含まれています。 ユーザーはクーポンを利用できる必要があります。これにより、ログテーブルに行が挿入され、クーポンが使用済みとしてマークされます(used列をに更新することによりtrue)。 もちろん、ここには明らかな競合状態/セキュリティ問題があります。 私は過去にもmySQLの世界で同様のことをしたことがあります。その世界では、両方のテーブルをグローバルにロックし、これは一度に1回だけ発生する可能性があるという知識のもとでロジックを安全に実行し、完了したらテーブルのロックを解除します。 Postgresでこれを行うより良い方法はありますか?特に、ロックがグローバルであることを心配していますが、グローバルである必要はありません。他の誰かがその特定のコードを入力しようとしていないことを確認するだけでよいので、行レベルのロックが機能するでしょうか?

1
Sch-M WAITはSQL Server 2014でSch-Sをブロックしますが、SQL Server 2008 R2ではブロックしませんか?
最近、実稼働インスタンスをSQL 2008 R2から新しいSQL 2014サーバーに移行しました。Service Brokerの使用法で明らかになった興味深いシナリオを次に示します。でデータベースを考えてみましょうBroker Enabled = trueとMyServiceしてMyQueue。このキューでは、有害メッセージの処理が無効になっています。キューにメッセージがあるアクティブな会話が2つ以上あります。 1つのプロセス(SPID 100)で実行します。 BEGIN TRANSACTION; DECLARE @conversation_group_id UNIQUEIDENTIFIER; RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue; トランザクションは開いたままにしていることに注意してください。これは、外部リソースで長時間待機している.NETプログラムであると想像してください。経てsys.dm_tran_locks、私たちは、このSPIDがキューにIXロックが付与されていることがわかります。 | type | resource_id | mode | status | spid | | OBJECT | 277576027 | IX | GRANT | 100 | 別のプロセス(SPID 101)で5回実行します。 BEGIN TRANSACTION; …

4
MySQL InnoDBは、READ COMMITTEDであっても削除時に主キーをロックします
序文 私たちのアプリケーションは、DELETEクエリを並行して実行するいくつかのスレッドを実行します。クエリは分離されたデータに影響します。つまりDELETE、別々のスレッドからの同じ行で同時発生する可能性はありません。ただし、ドキュメントごとに、MySQLはDELETEステートメントにいわゆる「次のキー」ロックを使用します。これにより、一致するキーと一部のギャップの両方がロックされます。このことはデッドロックを引き起こし、私たちが見つけた唯一の解決策はREAD COMMITTED分離レベルを使用することです。 問題 巨大なテーブルDELETEがJOIN複数ある複雑なステートメントを実行すると問題が発生します。特定のケースでは、警告が2行しかないテーブルがありますが、クエリは2つの個別のINNER JOINedテーブルから特定のエンティティに属するすべての警告を削除する必要があります。クエリは次のとおりです。 DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 day_positionテーブルが十分に大きい場合(私のテストケースでは1448行あります)、READ COMMITTED分離モードでもトランザクションはテーブル全体を ブロックしproc_warningsます。 この問題は常にこのサンプルデータ(http://yadi.sk/d/QDuwBtpW1BxB9)で再現されます(MySQL 5.1(5.1.59でチェック)およびMySQL 5.5(MySQL 5.5.24でチェック))。 編集:リンクされたサンプルデータには、クエリテーブルのスキーマとインデックスも含まれています。 CREATE TABLE `proc_warnings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `transaction_id` int(10) …

1
SQL Serverはいつロックを取得しますか?
ここにあるSQL Serverの分離レベルのリストには、トランザクション内で取得された書き込みロックは、トランザクションが終了するまで保持されることが記載されています。ただし、これらのロックがいつ取得されるかについては触れられていません。 ロックはデフォルトでトランザクションの開始時に取得されますか、それとも必要なときに取得されますか?後者が当てはまる場合、Xのロックが保持される時間を最小限に抑えるために、大規模なトランザクションでは書き込み操作をできるだけ遅く実行する方が有利でしょうか。

4
PostgreSQLで行ごとに一意のカウンターを維持するにはどうすればよいですか?
document_revisionsテーブルに一意の(行ごとの)リビジョン番号を保持する必要があります。リビジョン番号はドキュメントにスコープが設定されているため、テーブル全体ではなく、関連するドキュメントに対してのみです。 私は最初に次のようなものを思いつきました: current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); しかし、競合状態があります! 私はそれをpg_advisory_lockで解決しようとしていますが、ドキュメントは少し不足していて、完全に理解していません。誤って何かをロックしたくありません。 以下は許容されますか、それとも間違っていますか、それともより良い解決策がありますか? SELECT pg_advisory_lock(123); current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); SELECT pg_advisory_unlock(123); 代わりに、特定の操作(key2)のドキュメント行(key1)をロックするべきではありませんか?だからそれは適切な解決策でしょう: SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = …

2
Oracleでレコードがロックされている場合、どのレコードがロックされているかを知ることができますか?
レコードがロックされている場合、どのレコードがロックされているかを知ることができますか? レコードのROWIDまたはその他の情報を取得するにはどうすればよいですか? このSQLでいくつかの情報を得ることができます SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW# FROM v$locked_object a, dba_objects b, v$session c WHERE a.object_id = b.object_id AND a.SESSION_ID = c.sid(+) 関数を使用してROWIDを取得する方法をWebで見つけました DBMS_ROWID.ROWID_CREATE() しかし、それは機能していないようです。
10 oracle  locking 


2
クエリがテーブルレベルのロックを待機しないようにする方法
お客様のデータベースを追加のサーバーに移動した後、問題が発生しました。これはサイトのパフォーマンスにプラスの影響を与えるはずでしたが、MyISAMのテーブルロックに問題があります。(MyISAMの代わりにInnoDBを使用することを聞いたことがありますが、近い将来エンジンを変更することはできません)。 モデレーターが記事サイトのコメントをアクティブ化するときに実行されるupdate-queryにそれを見つけることができます。これはプロセスです: update-queryが処理されます SET status = 1 WHERE id = 5(インデックスが設定されます) ページのキャッシュファイルが削除されます この時点で、ページ全体が遅くなります。データベース自体は数分間ビジーです。私はプロセスリストを数回フェッチし、さまざまな選択クエリの約60のエントリを確認しました。これらはすべて、テーブルレベルのロックを待機している状態でした。 1.テーブルに対するこの更新が、テーブルレベルのロックを待機するテーブルのarticle_commentsselect-statementsに影響を与える理由がわかりませんarticle。プロセスリストでは、待機中のほとんどすべてのクエリがこのテーブルからのものでした。selectよりもupdate / insertが優先され、これがそのような問題を引き起こす可能性があるという事実を読みましたが、記事テーブル自体はコメントがアクティブになっても更新されないので、selectは待つべきではありません。私はそれを誤解しましたか? 2.この動作を防止するため、または少なくともより良いバランスを得るために、InnoDBに変更する以外に何かありますか?データベースを新しいサーバーに移動する前にこの問題が発生しなかったという事実に非常に苛立ちました。いくつかの設定ミスがあると思いますが、特定する方法がわかりません。

2
CREATE TABLE AS SELECT中にMySQLがロックする
次の(ダミー)クエリを実行しています CREATE TABLE large_temp_table AS SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.foo = b.foo LEFT JOIN c ON a.bar = c.bar クエリの実行に10分かかるとします。テーブルa、b、cの実行中に値を更新しようとすると、上記のクエリが最初に完了するまで待機します。このロックを回避したい(データの整合性は重要ではない)。どうすればそれを達成できますか? 使用:MySQL 5.1.41およびInnoDBテーブル ps SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 動作に変化はありません 更新 クエリが実行されている間、SHOW ENGINE INNODB STATUSの出力は次のようになります(ここでは目的のために非常に遅いクエリを作成しています)。 ===================================== 120323 15:26:29 INNODB MONITOR OUTPUT ===================================== Per second …
10 mysql  locking  ctas 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.