今回は、トランザクションを利用した、データの更新についてまとめていきます。

トランザクションとは、データの更新や削除をした時に、途中でエラーが発生し、中途半端なデータが出来上がるのを阻止するために使います。

トランザクション内に処理を書くことで、エラーが発生したときなど、更新処理をする前のデータに戻すことができるのです。

なのでトランザクションは、セーブポイントというイメージで私は使用しています。

とても便利なので是非使い方をマスターしてください!それではやっていきましょう。

トランザクションの使い方

トランザクションを開始するには、SqlConnection.BeginTransactionを使用します。

Dim tran As SqlTransaction
tran = 【SqlConnection】.BeginTransaction

SqlConnectionの部分は、宣言した変数なので自分が宣言した名前になります。

これで、トランザクションが開始されました。

次にトランザクションを終了する時ですが、正常に処理が行われたときは"Commit"、エラーが発生した場合は、"Rollback"を行います。

Commitは、トランザクションを開始してから、更新したデータを確定させることができます。

ロールバックは、トランザクションを開始した状態に、データを戻すことができます。

'正常終了(コミット)
tran.Commit()
'異常終了(ロールバック)
tran.Rollback()

 

使用例

下記のようなデータを用意したので、データを更新していきます。

正常時(コミット)

画面レイアウト

ID:00003 身長を170から180に変更し、更新していきます。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Try

        'SQL接続
        Dim connstr As String = My.Settings.SqlServer
        Dim sqlconn As New SqlConnection(connstr)
        Dim comm As New SqlCommand
        sqlconn.Open()

        'トランザクション
        Dim tran As SqlTransaction
        tran = sqlconn.BeginTransaction

        Try

            Dim sql As System.Text.StringBuilder = New System.Text.StringBuilder()
            sql.AppendLine("UPDATE hironimoTable")
            sql.AppendLine("SET")
            sql.AppendLine("  height = '" & txtHeight.Text & "'")
            sql.AppendLine("WHERE")
            sql.AppendLine("  id = '" & txtId.Text & "'")

            'SQL実行
            comm = New SqlCommand(sql.ToString, sqlconn)
            comm.Transaction = tran
            Dim ret As Integer = comm.ExecuteNonQuery()
            'コミット
            tran.Commit()

        Catch ex As Exception
            'ロールバック
            tran.Rollback()
            Throw
        End Try

        MsgBox("処理完了")

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

End Sub

 

実行結果
身長が180に更新されていると思います。

異常時(Rollback)

次はエラーを発生させてみましょう。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Try

        'SQL接続
        Dim connstr As String = My.Settings.SqlServer
        Dim sqlconn As New SqlConnection(connstr)
        Dim comm As New SqlCommand
        sqlconn.Open()

        'トランザクション
        Dim tran As SqlTransaction
        tran = sqlconn.BeginTransaction

        Try

            '正常処理

            Dim sql As System.Text.StringBuilder = New System.Text.StringBuilder()
            sql.AppendLine("UPDATE hironimoTable")
            sql.AppendLine("SET")
            sql.AppendLine("  height = '" & txtHeight.Text & "'")
            sql.AppendLine("WHERE")
            sql.AppendLine("  id = '" & txtId.Text & "'")

            'SQL実行
            comm = New SqlCommand(sql.ToString, sqlconn)
            comm.Transaction = tran
            Dim ret As Integer = comm.ExecuteNonQuery()


            '異常処理

            sql = New System.Text.StringBuilder()
            sql.AppendLine("UPDATE hironimoTable")
            sql.AppendLine("SET")
            sql.AppendLine("  height = 'a'")
            sql.AppendLine("WHERE")
            sql.AppendLine("  id = '00001'")
            'SQL実行
            comm = New SqlCommand(sql.ToString, sqlconn)
            comm.Transaction = tran
            ret = comm.ExecuteNonQuery()

            'コミット
            tran.Commit()

        Catch ex As Exception
            'ロールバック
            tran.Rollback()
            Throw
        End Try

        MsgBox("処理完了")

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

End Sub

 

数値の項目に文字列を登録しようとしているのでエラーになっています。

この時トランザクションを開始せずにこの処理を行うと、id:00003の身長は更新されたままになるが、

トランザクションを開始しているので、更新されず元の値になっています。

システムエラーが発生したときに、変なデータを残したくないので必ず更新処理の時はトランザクションを開始するようにしましょう!

今回は以上です。

おすすめの記事