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

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

3
ネットワーク遅延が増加すると、MS SQL Serverでテーブルロックが発生しますか?
高遅延ネットワークを介してSQL Serverデータベースを1回呼び出している場合、その遅延のためにテーブルロックが発生しますか?たとえば、テーブルAにいくつかのレコードを照会すると、SQL Serverはそのデータを低速ネットワーク経由で返す必要があります。サーバーがネットワーク経由で応答を送信するか、SQL Serverが送信前にロックを解除する間にテーブルAに読み取りロックが発生します応答? また、回答のサイズに基づいて答えは異なりますか?数KBと数百MBを返すだけでよい場合、違いはありますか? 明示的にトランザクションを作成し、クエリを実行し、トランザクションを閉じると、トランザクションの期間がレイテンシと相関するため、明らかにテーブルがロックされます。

5
データベーストランザクションとロックの正確な関係は何ですか?
これは、私の知識を増やすという精神で尋ねられた謙虚な質問です。親切に対応してください。 長年のアプリケーション開発者として、私はあるレベルでトランザクションとは何かを知っています(私は常にそれらを使用しています)。トランザクションの分離レベルはさておき、高レベルでは、トランザクションは作業ブロックを完全に完了させるか、まったく完了させず、他のデータベース変更アクティビティからある程度の分離を可能にします。 また、(さまざまなデータベースで)ロックが何であるか、または少なくとも1つの動作を知っています(何らかの方法でテーブルを明示的にロックした場合、他のプロセスまたはスレッドはそのテーブルについて何も更新できません)。 私がはっきりとはっきりしていないのは、さまざまなデータベースで、行またはテーブルを明示的にロックするときに、データベースのトランザクション機能で使用されるものとまったく同じ構造を使用して、トランザクションを適切に機能させることですか? つまり、トランザクションがアトミックで分離されるためには、何らかのロックを行わなければならないことがわかります。このトランザクションによって開始された、トランザクションに隠されたロックは、さまざまなデータベースが、SELECT FOR UPDATE明示的なLOCKコマンドなどの構造を介してアクセスできるのと同じ種類のロックですか?または、これらの2つの概念は完全に異なりますか? 繰り返しますが、この質問の素朴さをおaびします。より基本的な情報源を指摘できてうれしいです。

2
まだロックを保持しているクエリを見つける方法は?
sys.dm_tran_locksDMVを照会すると、テーブル、ページ、行などのリソースでロックを保持しているセッション(SPID)がわかります。 取得したロックごとに、どのSQLステートメント(削除、挿入、更新、または選択)がそのロックを引き起こしたかを判別する方法はありますか? DMV のmost_recent_query_handle列にはsys.dm_exec_connections最後に実行されたクエリのテキストが表示されますが、他のクエリは同じセッション(SPID)で実行され、ロックを保持していることが何度かあります。 私はすでにsp_whoisactive(Adam Machanicの)プロシージャを使用していますが、現時点では入力バッファー上にあるクエリのみを表示しています(考えてみてくださいDBCC INPUTBUFFER @spid)。 例えば: オープントランザクション/セッション ステートメントの実行(リソースのロックを保持) 同じセッションで別のステートメントを実行する 別のトランザクション/セッションを開き、ステップ2でロックされたリソースの変更を試みます。 このsp_whoisactive手順では、ステップ3でステートメントを指摘しますが、これはロックの原因ではないため、役に立ちません。 この質問は、ブロックされたプロセスレポート機能を使用して分析を実行し、本番環境でのブロックシナリオの根本原因を見つけることから生まれました。各トランザクションは複数のクエリを実行しますが、ほとんどの場合、最後のクエリ(BPRの入力バッファに表示される)がロックを保持するクエリになることはほとんどありません。 フォローアップの質問があります:ブロッキングクエリを効果的に識別するフレームワーク

2
SQL Serverの複数のワーカーのFIFOキューテーブル
次のstackoverflowの質問に答えようとしました: 複数のサーバーアプリケーションインスタンスで個々のテーブル行を処理するには、どのSQL Server 2005/2008ロックアプローチを使用する必要がありますか? やや素朴な答えを投稿した後、私は自分の口がどこにあるかを考え、実際に私が提案しているシナリオをテストしました。まあ、それは思ったよりもはるかに難しいことが判明しました(誰にも驚きはありません、確かです)。 ここで私が試し、考えたことがあります: まず、派生テーブル内でORDER BYを使用して、TOP 1 UPDATEを試しましたROWLOCK, READPAST。これによりデッドロックが発生し、アイテムの順序が狂って処理されました。同じ行を複数回処理しようとすることを必要とするエラーを除いて、可能な限りFIFOに近い必要があります。 私は、その後の様々な組み合わせを使用して、変数に所望の次のキューIDを選択しようとしたREADPAST、UPDLOCK、HOLDLOCK、及びROWLOCK排他的にそのセッションによって更新するための行を保存します。私が試したすべてのバリエーションは、以前と同じ問題に悩まされていましたREADPAST。 READ COMMITTEDまたはREPEATABLE READ分離レベルでのみREADPASTロックを指定できます。 READ COMMITTED であったため、これは混乱を招きました。以前にこれに遭遇したことがあり、イライラします。 この質問を書き始めてから、Remus Rusaniが質問に対する新しい回答を投稿しました。私は彼のリンクされた記事を読んで、彼が破壊的な読み取りを使用していることを確認しました。彼は答えで、「Webコールの間、ロックを保持することは現実的に不可能です」と述べた。更新または削除を行うためにロックが必要なホットスポットとページに関する彼の記事の内容を読んだ後、探していることを行うために正しいロックを実行できたとしても、それはスケーラブルではなく、大規模な並行性を処理しません。 今、どこに行けばいいのかわかりません。行の処理中にロックを維持することはできません(高tpsまたは大規模な同時実行性をサポートしていなくても)。私は何が欠けていますか? 私より賢い人と私より経験のある人が助けてくれることを期待して、私が使用していたテストスクリプトを以下に示します。TOP 1 UPDATEメソッドに切り替えられますが、他のメソッドを残し、コメントアウトしてありますので、あなたもそれを調べたいと思います。 これらをそれぞれ別のセッションに貼り付け、セッション1を実行してから、他のすべてをすばやく実行します。約50秒でテストは終了します。各セッションからのメッセージを見て、どのような作業を行ったか(またはどのように失敗したか)を確認してください。最初のセッションでは、存在するロックと処理中のキューアイテムの詳細を2回目に撮影したスナップショットを含む行セットが表示されます。それは時々機能し、他の時間はまったく機能しません。 セッション1 /* Session 1: Setup and control - Run this session first, then immediately run all other sessions */ IF Object_ID('dbo.Queue', 'U') IS NULL CREATE …

2
SELECTをブロックする大規模なINSERT
SELECT操作をブロックしている大量のINSERTに問題があります。 スキーマ このようなテーブルがあります: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = …

1
nvarchar列のサイズを変更する場合、一意のインデックスを削除する必要がありますか?また、インデックスの再作成時にテーブルがロックされますか?
私たちのデータベースには、次のような多かれ少なかれ大きなテーブルがあります。 CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); しかし、今ではシリアルフィールドのサイズが小さくなっているので、32に変更したいと思います。VisualStudioスキーマ比較ツールは、これを行うことを提案します。 DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); これは本当に必要ですか?それとも、これを行う超保存的な方法のようなものですか? また、一意のインデックスを再作成すると、テーブルがロックされますか?これは大きな問題になるためです(テーブルには3,000万行あり、インデックスの再作成にはかなり時間がかかると思います)。これは、次のメンテナンスウィンドウが数か月先になるためです。私の選択肢は何ですか?

1
このRX-Xロックが拡張イベントに表示されないのはなぜですか?
問題 シリアライズ可能な分離の下で、RX-Xロックを引き起こすクエリのペアがあります。ただし、拡張イベントを使用してロックの取得を監視すると、RX-Xロックの取得は表示されず、リリースされるだけです。それはどこから来たのですか? 再現 私のテーブルは次のとおりです。 CREATE TABLE dbo.LockTest ( ID int identity, Junk char(4) ) CREATE CLUSTERED INDEX CX_LockTest --not unique! ON dbo.LockTest(ID) --preload some rows INSERT dbo.LockTest VALUES ('data'),('data'),('data') ここに私の問題のバッチがあります: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN INSERT dbo.LockTest VALUES ('bleh') SELECT * FROM dbo.LockTest WHERE ID = SCOPE_IDENTITY() --ROLLBACK …

2
MS SQL Serverでテーブル全体をロックしないようにSQLの挿入や更新を行う方法
DBの仕事を始めたばかりなので、基本的な質問に対する忍耐に感謝してください。ローカルマシンでSQL Server 2014を実行しています。小さなテーブルと、さまざまなアプローチをテストするための基本的なクライアントアプリケーションがあります。INSERT INTOand UPDATEステートメントの両方でテーブルロックのように見えるものを取得しています。クライアントは、次のコードを持つASP.NETアプリケーションです。 OleDbConnection cn = new OleDbConnection("Provider=SQLNCLI11; server=localhost\\SQLEXPRESS; Database=<my db>; user id=<my uid>; password=<my pwd>"); cn.Open(); OleDbTransaction tn = cn.BeginTransaction(); OleDbCommand cmd = new OleDbCommand("INSERT INTO LAYOUTSv2 (LAYOUTS_name_t, LAYOUTS_enabled_b, LAYOUTS_data_m) VALUES ('name', '-1', 'data')", cn, tn); cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT SCOPE_IDENTITY()"; int newkey = Decimal.ToInt32((decimal)cmd.ExecuteScalar()); Console.WriteLine("Created index …

4
InnoDBの行ロック-実装方法
私は今、mysqlサイトを読んで見回していますが、それがどのように機能するかを正確に見ることができません。 書き込みの結果を選択して行ロックし、変更を書き込み、ロックを解除します。audocommitはオンです。 スキーム id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) ステータスが保留中のアイテムを選択し、作業中に更新します。排他的な書き込みを使用して、同じアイテムが2回ピックアップされないようにします。 そう; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" 結果からIDを取得します "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> ロックを解除するために何かする必要がありますか?
13 mysql  innodb  locking 


1
UPDLOCKによりSELECTがハング(ロック)するのはなぜですか?
テーブル全体をロックするSQL SERVERにselectがあります。 セットアップスクリプトは次のとおりです(上書きしないようにしてください)。 USE [master] GO IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB') DROP DATABASE LockingTestDB GO CREATE DATABASE LockingTestDB GO USE [LockingTestDB] GO IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable') DROP TABLE LockingTestTable GO CREATE TABLE LockingTestTable ( Id int IDENTITY(1, 1), Name …

2
SQL Serverインデックス更新のデッドロック
同時に実行するとデッドロックが発生する2つのクエリがあります。 クエリ1-インデックス(index1)に含まれる列を更新します。 update table1 set column1 = value1 where id = @Id table1でXロックを取得してから、index1でXロックを試行します。 クエリ2: select columnx, columny, etc from table1 where {some condition} index1でS-Lockを取得してから、table1でS-Lockを試行します。 同じクエリを維持しながらデッドロックを防ぐ方法はありますか?たとえば、更新前に更新トランザクションのインデックスでX-Lockを何らかの方法で取得して、テーブルとインデックスのアクセスが同じ順序であることを確認できますか?デッドロックを防ぐことができますか? 分離レベルは読み取りコミットです。インデックスの行ロックとページロックが有効になっています。同じレコードが両方のクエリに参加している可能性があります。パラメータが表示されないため、デッドロックグラフからはわかりません。 デッドロックグラフ

1
非クラスター化インデックスで異なる行を更新するときのデッドロック
idフィールドでクラスター化インデックスと非クラスター化インデックスを使用すると、ロックの動作が異なることに気付きながら、デッドロックの問題を解決しています。clustedインデックスまたはプライマリキーがidフィールドに適用されると、デッドロックの問題は解決されるようです。 異なる行に対して1つ以上の更新を実行する異なるトランザクションがあります。たとえば、トランザクションAはID = aの行のみを更新し、tx BはID = bの行のみを更新します。 そして、インデックスなしでは、更新はすべての行の更新ロックを取得し、必要に応じて排他ロックに変換し、最終的にデッドロックにつながることを理解しています。しかし、非クラスター化インデックスでは、デッドロックが依然として存在する理由を見つけることができません(ただし、ヒット率は低下しているようです) データ表: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] [datetime] NULL, [todoOrder] [text] NULL ) デッドロックトレース deadlock-list deadlock victim=process4152ca8 process-list process id=process4152ca8 taskpriority=0 …


1
MySQL:トランザクションは行をロックしますか?
これまでにMySQLトランザクションを使用したことはありません。何かを明確にしたいだけです。 2人のユーザーが正確な時間にクエリを実行した場合、MySQLはこれをどのように処理しますか?たとえば、ユーザーがレコードを更新しようとしています。 user1:テーブルセットの更新column = column-4 where column_id = 1; user2:テーブルセットを更新しますcolumn = column-7 where column_id = 1; トランザクションを使用する場合、MySQLは最初に実行されるクエリを選択し、最初のクエリがコミットされるまで2番目のユーザーをロックしますか?それはテーブルロックですか、それとも行ロックですか? 3番目のユーザーがselectステートメントを発行するとどうなりますか?MySQLが返す値は何ですか? PSこれはInnodbにあります。

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