前回はトランザクションの意義について説明しました。
今回は実装してみたいと思います。
コミット
では、トランザクションで処理を行いコミットしてみたいと思います。
以下例文です。
IF OBJECT_ID(N'tempdb..#TEMP', N'U') IS NOT NULL DROP TABLE #TEMP CREATE TABLE #TEMP ( NUM BIGINT, TXT NVARCHAR(10) ) BEGIN TRANSACTION DECLARE @CNT INT SET @CNT = 0 WHILE @CNT <= 30 BEGIN INSERT INTO #TEMP VALUES( POWER(2, @CNT), '2^' + CONVERT(VARCHAR, @CNT) ) SET @CNT += 1 END COMMIT TRANSACTION SELECT * FROM #TEMP
こんな感じに出力されます。
BEGIN TRANSACTIONでトランザクションを開始して、COMMIT TRANSACTIONでコミットされるということです。
ロールバック
ではもし、COMMIT TRANSACTIONではなく、ROLLBACK TRANSACTIONだとどうなるでしょうか。
IF OBJECT_ID(N'tempdb..#TEMP', N'U') IS NOT NULL DROP TABLE #TEMP CREATE TABLE #TEMP ( NUM BIGINT, TXT NVARCHAR(10) ) BEGIN TRANSACTION DECLARE @CNT INT SET @CNT = 0 WHILE @CNT <= 30 BEGIN INSERT INTO #TEMP VALUES( POWER(2, @CNT), '2^' + CONVERT(VARCHAR, @CNT) ) SET @CNT += 1 END ROLLBACK TRANSACTION SELECT * FROM #TEMP
こんなかんじに、トランザクションを開始してそれ以降の処理を行いますが、ロールバックを行うので、最後はトランザクション処理の前に戻ってしまうので、SELECTで出力しても何も中身はありません。
以上、次回はエラーを検知してロールバック処理を行います。