15

私は仕事でいくつかのSPを吹き替えています、そして私はコードを書いた人は誰でもこのような単一の更新ステートメントでトランザクションを使用したことを発見しました

begin transaction 
*single update statment:* update table whatever with whatever
commit transaction

複数の更新を更新するときにトランザクションが使用されるため、これが間違っていることを理解しています。理論的な観点から理解したいのですが、上記のコードを使用することの意味は何ですか?トランザクションがある場合とない場合で、テーブルの更新に違いはありますか?余分なロックなどはありますか?

4

3 に答える 3

8

おそらく、他のデータを含む可能性のある以前のコードまたは将来の可能性のあるコードのために、トランザクションが含まれていました。おそらく、その開発者は、「安全」にするために、単にコードをトランザクションでラップする習慣をつけているのでしょうか。

しかし、ステートメントが文字通り単一の行への単一の更新のみを含む場合、この場合、そのコードが存在することに実際には利点はありません。もちろん、トランザクション内で実行されるアクションは可能ですが、トランザクションは必ずしも何かを「ロック」するわけではありません。そこに含まれるすべてのアクションがオールオアナッシングで実行されることを確認するだけです。

トランザクションは複数のテーブルに関するものではなく、複数の更新に関するものであることに注意してください。複数の更新がすべてまたはまったく発生しないことを保証します。

したがって、同じテーブルを2回更新する場合、トランザクションがある場合とない場合で違いがあります。しかし、あなたの例は、おそらく単一のレコードのみを更新する単一の更新ステートメントのみを示しています。

実際、トランザクションが同じテーブルへの複数の更新をカプセル化することはおそらくかなり一般的です。次のことを想像してみてください。

INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200)
INSERT INTO Transactions (AccountNum, Amount) values (2, -200)

お金が正しく送金されることを保証するために、それはトランザクションにラップされるべきです。一方が失敗した場合、もう一方も失敗する必要があります。

于 2012-09-11T12:29:05.313 に答える
7

複数のテーブルを更新するときにトランザクションが使用されるため、これは間違っていると理解しています。

必ずしも。これには、1つのテーブルのみが含まれ、2つの行のみが含まれます。

--- transaction  begin

BEGIN TRANSACTION ;

UPDATE tableX 
SET Balance = Balance + 100
WHERE id = 42 ;

UPDATE tableX 
SET Balance = Balance - 100
WHERE id = 73 ;

COMMIT TRANSACTION ;

--- transaction  end
于 2012-09-11T12:28:27.350 に答える
6

うまくいけば、同僚のコードはこのようになります。そうでない場合、SQLは構文エラーを発行します。Ypercubeのコメントによると、トランザクション内に1つのステートメントを配置することに実際の目的はありませんが、おそらくこれはコーディング標準または同様のものです。

begin transaction  -- Increases @@TRANCOUNT to 1
update table whatever with whatever
commit transaction  -- DECREMENTS @@TRANCOUNT to 0

多くの場合、SQLに対して直接アドホックステートメントを発行する場合、何か問題が発生してロールバックする必要がある場合に備えて、ステートメントをトランザクションでラップすることをお勧めします。

begin transaction -- Just in case my query goofs up
update table whatever with whatever
select ... from table ... -- check that the correct updates / deletes / inserts happened
-- commit transaction  -- Only commit if the above check succeeds.
于 2012-09-11T12:29:08.783 に答える