SQL Server トランザクション

トランザクション

トランザクション(transaction)とは、不整合を起こさせないための一連の操作の集合のことで、一連の操作全体が一つの単位とみなされます。
複数のSQLを発行してデータ操作をしても、トランザクションを正常に終了させないと、全くデータ操作をしなかったのと同じになるようにされています。

新幹線のチケット販売を考えたとき、支払と切符の販売はセットであり、片方だけでは不都合が起こることから、支払と販売はトランザクション管理されないといけないことが容易に想像できると思います。

トランザクションの開始

SQL Server でトランザクション処理を開始するには、’bigin tran’句を発行します。
トランザクションは’bigin tran tran名’と言うようにトランザクション名を付けることができます。
トランザクション名は 32 文字まで有効です。(超えた分は切り捨てられます)

SQL Server は分散処理もできるため、トランザクションを分散トランザクションとしても実行できます。
その他、マークを付けたりもできます。
また、おかしなことを言うようですが、ネストもできます。複雑なデータ操作だと必要になることあるそうです。
高度なトランザクション管理を行いたい場合は、より深く調査をしてください。

一般的な一連の操作で済む処置であれば(ほとんどがそうなると思うのですが。。。)、以下のように発行してください。


BEGIN TRAN T1

トランザクション終了

トランザクションを終了させるには、’commit’句を発行します。


COMMIT TRAN T1

トランザクションを中断する

何らかのトラブルがあり、トランザクションを中断させ、データ操作を無かったことにしたい場合に’rollback’句を発行します。
プログラムの中だとエラーハンドリンして、その中でロールバックさせるのが一般的です。


rollback

以下に簡単なトランザクションの例を載せておきます。

正常に終了するパターン:

create table tbl1 (a_cd nvarchar(9))
create table tbl2 (a_cd nvarchar(9))

declare @acd nvarchar(9)
set @acd='00001'

begin tran t1

begin try

  insert into tbl1 (a_cd) values (@acd)
  insert into tbl2 (a_cd) values (@acd)

  commit tran t1

end try
begin catch

  rollback

end catch

select * from tbl1
select * from tbl2

-----後処理
drop table tbl1
drop table tbl2

set @acd=1/0を入れエラーを起こさせたパターン:

create table tbl1 (a_cd nvarchar(9))
create table tbl2 (a_cd nvarchar(9))

declare @acd nvarchar(9)
set @acd='00001'

begin tran t1

begin try

  insert into tbl1 (a_cd) values (@acd)
  insert into tbl2 (a_cd) values (@acd)
  set @acd=1/0

  commit tran t1

end try
begin catch

  rollback

end catch

select * from tbl1
select * from tbl2

-----後処理
drop table tbl1
drop table tbl2

動かしてみるとわかりますが、rollbackも含め正常にトランザクション処理されています。

なお、テーブル変数を使うと、テーブル変数は持続性のあるデータベースの一部ではないため、トランザクションのロールバックによる影響を受けません。
ロールバックしてもデータは途中までの操作が有効になったままなので、トランザクション処理を行う時は要注意です。

以上、トランザクションの簡単な説明でした。