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

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

1
MySQLでテーブルを交換するにはどうすればよいですか?
時々foo計算されるいくつかの統計を含むテーブルがあるとします。他のクエリで頻繁に使用されます。 だからこそ、最新の統計を計算foo_newし、計算の準備ができたらそれらを交換したいのです。 私はそれをできた ALTER TABLE foo RENAME foo_tmp; ALTER TABLE foo_new RENAME foo; しかしfoo、テーブルがないときにクエリがこれらの2行の間にテーブルを必要とする場合はどうなりますfooか?どういうわけかロックする必要があると思います...または別の方法がありますか?


5
PostgreSQLでの同時DELETE / INSERTのロックの問題
これは非常に簡単ですが、PG(v9.0)の機能に困惑しています。簡単な表から始めます。 CREATE TABLE test (id INT PRIMARY KEY); 数行: INSERT INTO TEST VALUES (1); INSERT INTO TEST VALUES (2); お気に入りのJDBCクエリツール(ExecuteQuery)を使用して、2つのセッションウィンドウをこのテーブルが存在するdbに接続します。両方ともトランザクション対応です(つまり、auto-commit = false)。それらをS1およびS2と呼びましょう。 それぞれに同じコードのビット: 1:DELETE FROM test WHERE id=1; 2:INSERT INTO test VALUES (1); 3:COMMIT; 次に、これをスローモーションで実行し、ウィンドウで1つずつ実行します。 S1-1 runs (1 row deleted) S2-1 runs (but is blocked since S1 has a write …

4
NOLOCKは常に悪いですか?
私は、可能な限り効率的にクエリを作成したいレポート開発者です。以前は、運用サーバーでレポートを処理していたためNOLOCK、すべてのクエリで使用できると言っていたDBAと仕事をしていました。 今、私はNOLOCKどんな状況下でも禁止しているDBAと仕事をしています-私のレポート(いくつかのテーブルのインデックスがかなり不足しているため)がレプリケーションとシステムの更新を停止している場合でも。私の意見では、この場合、a NOLOCKは良いことです。 私のSQLトレーニングのほとんどは、非常に異なる意見を持つさまざまなDBAに来ているので、これを多種多様なDBAに依頼したいと思いました。

3
実動テーブルへの列の追加
SQL Server 2008 R2の大規模な運用テーブルに列を追加する最良の方法は何ですか?オンラインのMicrosoftの本によると: ALTER TABLEで指定された変更はすぐに実装されます。変更がテーブル内の行の変更を必要とする場合、ALTER TABLEは行を更新します。ALTER TABLEは、テーブルのスキーマ変更ロックを取得して、最後に非常に短いSCH-Mロックを必要とするオンラインインデックス操作を除き、変更中に他の接続がテーブルのメタデータを参照しないようにします。 (http://msdn.microsoft.com/en-us/library/ms190273.aspx) 数百万行の大きなテーブルでは、これには時間がかかる場合があります。停止することが唯一の選択肢ですか?このような状況に対処する最善の方法は何ですか?

3
SELECT-UPDATEパターンを使用する場合の同時実行性の管理
次のコードがあるとしましょう(ひどいことは無視してください): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else 私の目には、これは並行性を適切に管理していません。トランザクションがあるからといって、更新ステートメントに到達する前に他の誰かがあなたと同じ値を読み取らないということにはなりません。 今、コードをそのままにしておきます(これは単一のステートメントとして処理するか、自動インクリメント/ ID列を使用することをお勧めします)並行性を適切に処理し、2つのクライアントが同じになる競合状態を防ぐ確実な方法id値? WITH (UPDLOCK, HOLDLOCK)SELECTにa を追加するとうまくいくと確信しています。SERIALIZABLEトランザクション分離レベルは、(それは誰にもTRANが終わるまで、あなたが何をしたか読むことを拒否したことから、同様の作業に思えるでしょうUPDATE:これは偽であることがわかりマーティンの答え)。本当?どちらも同等に機能しますか?一方が他方よりも優先されますか? IDの更新よりも正当なもの、つまり更新が必要な読み取りに基づいた計算を行うことを想像してください。多数のテーブルが関係している可能性がありますが、そのうちのいくつかは書き込みを行い、他のテーブルは書き込みを行いません。ここでのベストプラクティスは何ですか? この質問を書いた後、必要なテーブルのみをロックしているので、ロックヒントの方が優れていると思いますが、誰かの入力に感謝します。 PSそして、いいえ、私は最良の答えを知りません、そして、本当に、より良い理解を得たいです!:)

3
SQL Serverでアプリロックリクエストをキャンセルするにはどうすればよいですか?
sp_getapplockストアドプロシージャは、次の戻り値があります。 0:ロックは同期的に正常に許可されました。 1:他の互換性のないロックが解放されるのを待った後、ロックが正常に許可されました。 -1:ロック要求がタイムアウトしました。 -2:ロック要求はキャンセルされました。 -3:ロック要求がデッドロックの犠牲者として選択されました。 -999:パラメーターの検証またはその他の呼び出しエラーを示します。 sp_getapplockデータアクセスレイヤーで呼び出すためのラッパーを書いています。どのような状況で-2が返されるのかを知りたいので、説明的で役立つ例外をスローできます。-1と-3の戻り値の意味は明らかであり、これらの値が返されるテスト条件を簡単に作成できます。どのようにして-2の戻り値を取得できますか?

6
SQL Server IDの値を順番に読み取ることに依存できますか?
TL; DR:次の質問に要約します:行を挿入するとき、新しい値の生成とクラスター化インデックス内の対応する行キーのロックの間に機会がありますか?外部オブザーバーはより新しいものを見ることができます並行トランザクションによって挿入された値?(SQL Serverで。)Identity Identity 詳細バージョン Identityという名前の列を持つSQL ServerテーブルがありますCheckpointSequence。これは、テーブルのクラスター化インデックスのキーです(これには、追加の非クラスター化インデックスもいくつかあります)。行は、いくつかの並行プロセスとスレッドによって(分離レベルで、なしで)テーブルに挿入されます。同時に、クラスター化インデックスから定期的に行を読み取るプロセスがあり、その列で並べ替えられます(分離レベルでも、オプションはオフになっています)。READ COMMITTEDIDENTITY_INSERTCheckpointSequenceREAD COMMITTEDREAD COMMITTED SNAPSHOT 私は現在、読み取りプロセスがチェックポイントを「スキップ」できないという事実に依存しています。私の質問は、このプロパティに依存できますか?そうでない場合、それを実現するために何ができますか? 例:ID値が1、2、3、4、および5 の行を挿入する場合、値4の行を表示する前に、値5の行を参照してはなりません。テストは、ORDER BY CheckpointSequence句(そしてWHERE CheckpointSequence > -1確実句)、ブロック行4、行5が既にコミットされていても、読まれるべきであるが、まだコミットされていない時はいつでも。 少なくとも理論的には、この仮定を破る可能性のある競合状態がここにあると思います。残念ながら、上のドキュメントでIdentityはIdentity、複数の同時トランザクションのコンテキストでどのように機能するかについてはあまり言及されていません。「特定のトランザクションの新しい値はそれぞれ、テーブル上の他の同時トランザクションとは異なります。」(MSDN) 私の推論は、それはこのように何らかの形で動作する必要があります: トランザクションが(明示的または暗黙的に)開始されます。 ID値(X)が生成されます。 対応する行ロックは、ID値に基づいてクラスター化インデックスで取得されます(ロックエスカレーションが開始されない限り、この場合、テーブル全体がロックされます)。 行が挿入されます。 トランザクションがコミットされる(おそらくかなり長い時間後に)ので、ロックは再び削除されます。 ステップ2と3の間に、非常に小さなウィンドウがあると思います 同時セッションは次のID値(X + 1)を生成し、残りのすべてのステップを実行できます。 したがって、その時点で正確に来ている読者が値X + 1を読み取ることができ、Xの値は失われます。 もちろん、これの可能性は非常に低いようです。しかし、まだ-それは起こる可能性があります。それともできますか? (コンテキストに興味がある場合:これは、NEventStoreのSQL Persistence Engineの実装です。NEventStoreは、すべてのイベントが新しい昇順チェックポイントシーケンス番号を取得する追加専用のイベントストアを実装します。クライアントは、チェックポイント順にイベントストアからイベントを読み取りますすべての種類の計算を実行するため。チェックポイントXのイベントが処理されると、クライアントは「新しい」イベント、つまりチェックポイントX + 1以上のイベントのみを考慮します。したがって、イベントをスキップしないことが重要です。現在、Identityベースのチェックポイント実装がこの要件を満たしているかどうかを判断しようとしています。これらは、使用されている正確なSQLステートメントです。Schema、Writerのquery、読者の質問。) 私が正しいと上記の状況が発生する可能性がある場合、それらに対処する2つのオプションのみが表示されますが、どちらも不十分です。 Xを確認する前にチェックポイントシーケンス値X + 1を確認した場合は、X + 1を終了し、後で再試行してください。ただし、Identityもちろんギャップが発生する可能性があるため(たとえば、トランザクションがロールバックされるとき)、Xが来ることはありません。 したがって、同じアプローチですが、nミリ秒後にギャップを受け入れます。ただし、nのどの値を想定する必要がありますか? より良いアイデアはありますか?

3
すべてのクエリで(nolock)ヒントを使用しないで正当化する
クエリヒントを使用しないことを正当化する必要がありましたか? WITH (NOLOCK)非常に忙しいサーバーにヒットするすべてのクエリで見ています。開発者は、コードで何千回もそれを見るのが嫌いなので、デフォルトでオンにするだけだと思っているのです。 ダーティリードが許可され、最終的に不良データが発生することを説明しようとしましたが、パフォーマンスのトレードオフはそれだけの価値があると考えています。(それらのデータベースは混乱しています。パフォーマンスの問題があるのも不思議ではありません。) このNOLOCKヒントの悪用に対するケースを提示する方法の明確な例があれば、それはありがたいです。

6
Oracleテーブルがロックされているかどうかを確認する方法は?
Oracle Enterprise 11gR2にインストールされているBIソフトウェアとリポジトリデータベースを使用しています。 これらのバッチレポートの一部は、まだロックされている可能性のあるデータベーステーブルにアクセスしようとします。Oracleテーブルがロックされているかどうかを確認するにはどうすればよいですか?分析の履歴詳細のように表示されるSQLステートメントはありますか?

6
SQL Serverでは、選択した行グループがロックされているかどうかを確認する方法はありますか?
数十億行のテーブルの多数のレコードを更新/削除しようとしています。これは一般的なテーブルであるため、このテーブルのさまざまなセクションで多くのアクティビティがあります。すべての行のロックまたはページロックまたはテーブルロックの取得を待機しているため、大規模な更新/削除アクティビティが長時間ブロックされているため、タイムアウトになるか、タスクの完了に数日かかります。 そのため、一度に行の小さなバッチを削除するアプローチを変更しています。しかし、選択された(たとえば、100または1000または2000行)が現在別のプロセスによってロックされているかどうかを確認します。 そうでない場合は、削除/更新に進みます。 ロックされている場合は、次のグループのレコードに進みます。 最後に、最初に戻って、残ったものを更新/削除してみてください。 これは実行可能ですか? ありがとう、ToC


2
SQL Serverでロックされたテーブルまたは行を検出する
ブロックされたセッションの詳細を追跡する方法を理解/学習しようとしています。 そこで、次のセットアップを作成しました。 create table foo (id integer not null primary key, some_data varchar(20)); insert into foo values (1, 'foo'); commit; 次に、2つの異なるクライアントからデータベースに2回接続します。 最初のセッションの問題: begin transaction update foo set some_data = 'update' where id = 1; ロックを保持するために、明示的にコミットしません。 2番目のセッションでは、同じステートメントを発行します。もちろん、ロックのために待機します。セッション2がfooテーブルを待機していることを確認するために、さまざまなクエリを使用しようとしています。 sp_who2 以下を示します(重要な情報のみを表示するためにいくつかの列を削除しました)。 SPID | ステータス| BlkBy | DBName | コマンド| SPID | リクエストID ----- …

2
CREATE TABLEをロックする
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 5年前に移行され ました。 別のアプリケーションでは、設計が悪いことに感銘を受けました。複数のスレッドがEnsureDatabaseSchemaExists()メソッドを同時に実行します。これは基本的に次のようになります。 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN CREATE TABLE MyTable ( ... ); END ただし、SERIALIZABLEトランザクションで実行された場合でも、このコードはスレッドセーフではないようです(つまり、並列コードはテーブルを複数回作成しようとします)。別のスレッドがまったく同じSELECTステートメントを実行できないようにするロックを取得するためにSELECTステートメントを強制する機会はありますか? multi-threaded-EnsureSchemaExists()メソッドのより良いパターンはありますか?

2
SQL Serverでは、読み取りロックはどのように機能しますか?
次の長時間実行クエリがあるとします UPDATE [Table1] SET [Col1] = 'some value' WHERE [Col2] -- some clause which selects thousands of rows 上記のクエリの実行中に次のクエリが実行されると仮定します SELECT * FROM [Table1] 最初のクエリは、最初のクエリが完了するまで2番目のクエリの実行を妨げますか?その場合、最初のクエリは、2番目のクエリがすべての行またはWHERE句に含まれる行だけで実行されるのを防ぎますか? 編集: 2番目のクエリが SELECT [Col1], [Col2] FROM [Table1] WHERE [Col2] -- some clause whose matching elements overlap those from -- the clause in the first query and …

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