2012-04-12 21 views
3

ストアドプロシージャでbegin transactionを使用します。私は、データを更新するコードがあります。BEGIN TRANSACTIONは行/列ロックを行いますか?

UPDATE 
    employee 
SET 
    name = @name, 
    surname = @surname 
WHERE 
    empId = @empid; 

んSQL Serverの更新されている行またはcoloumn上の任意のロックを行いますか?これが当てはまらない場合は、進行中の現在の更新がある間に他のユーザーが別の更新を実行しないようにするにはどうすればよいですか?ストアドプロシージャにする必要はありません.C#もオプションです。

+2

いいえ - 何もしないだけではBEGIN TRANSACTIONを。 UPDATEステートメントは、更新される行(または複数の行)の**更新ロック**(U)を取得しようとし、トランザクションが完了するまでそれらのロックを保持します( 'COMMIT'または' ROLLBACK') 。 –

+0

@marc_s:これは100%正確ではありません。 **(1)**通常、 'U'ロックは行が読み込まれるときに取られます。次に、 'SQL Server'が更新を決定すると、' U'ロックを 'X'ロックの行に変換して' X'ロックを行います。 **(2)**しかし、場合によっては、 'SQL Server'は' X'ロックを直接取ることにします( 'U'ロックと' U-> X'変換)。 –

+0

@BogdanSahlean:OK - 多分 - しかし、BEGIN TRANSACTION自体は何もしていません - それはOPが求めていたものです。右?? –

答えて

3

SQL Serverは、アクセスされているオブジェクトに対してロックを発行します。ロックは、カバーの下で起こっていることに関してかなり複雑になります。

特定の更新文については、1つの行が更新されていると仮定します。

  • 行:アクセス権を得るためにロックを更新するデータを更新し、データが変更されたときに排他ロックに変換します。

  • Page:Intent Update:データが変更されたときにExent Exclusiveに変換されます。

  • テーブル:インテントアップデート。

MSサイト上のロックモードの詳細がたくさんあります:デフォルトMSSQLことでhttp://msdn.microsoft.com/en-us/library/ms175519(v=sql.100).aspx

0

これがsprocの唯一の文であれば、それはトランザクションです。それぞれのステートメントがアトミックであり、動作するかどうかを忘れないでください。ロックを心配する必要はありません。

1

は、UPDATE文の行レベルロックを作成します。 UPDATEステートメントの影響を受けるすべての行はロックされ、更新が行われている間に他のユーザーがこれらの行を変更できなくなります。

あなたはロックヒントを使用することによって、デフォルトのロック動作を変更することはできません:http://msdn.microsoft.com/en-us/library/aa213026%28v=sql.80%29.aspx

関連する問題