SqlConnection.BeginTransaction メソッド

定義

データベース トランザクションを開始します。

オーバーロード

名前 説明
BeginTransaction()

データベース トランザクションを開始します。

BeginTransaction(IsolationLevel)

指定した分離レベルでデータベース トランザクションを開始します。

BeginTransaction(String)

指定したトランザクション名でデータベース トランザクションを開始します。

BeginTransaction(IsolationLevel, String)

分離レベルとトランザクション名を指定してデータベース トランザクションを開始します。

BeginTransaction()

データベース トランザクションを開始します。

public:
 System::Data::SqlClient::SqlTransaction ^ BeginTransaction();
public System.Data.SqlClient.SqlTransaction BeginTransaction();
member this.BeginTransaction : unit -> System.Data.SqlClient.SqlTransaction
override this.BeginTransaction : unit -> System.Data.SqlClient.SqlTransaction
Public Function BeginTransaction () As SqlTransaction

返品

新しいトランザクションを表すオブジェクト。

例外

複数のアクティブな結果セット (MARS) を使用する場合、並列トランザクションは許可されません。

並列トランザクションはサポートされていません。

次の例では、 SqlConnectionSqlTransactionを作成します。 また、 BeginTransactionCommit、および Rollback メソッドの使用方法についても説明します。

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction();

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction.
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }
}
Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
    Using connection As New SqlConnection(connectionString)
        connection.Open()

        Dim command As SqlCommand = connection.CreateCommand()
        Dim transaction As SqlTransaction

        ' Start a local transaction
        transaction = connection.BeginTransaction()

        ' Must assign both transaction object and connection
        ' to Command object for a pending local transaction.
        command.Connection = connection
        command.Transaction = transaction

        Try
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
            command.ExecuteNonQuery()
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"

            command.ExecuteNonQuery()

            ' Attempt to commit the transaction.
            transaction.Commit()
            Console.WriteLine("Both records are written to database.")

        Catch ex As Exception
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType())
            Console.WriteLine("  Message: {0}", ex.Message)

            ' Attempt to roll back the transaction.
            Try
                transaction.Rollback()

            Catch ex2 As Exception
                ' This catch block will handle any errors that may have occurred
                ' on the server that would cause the rollback to fail, such as
                ' a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
                Console.WriteLine("  Message: {0}", ex2.Message)
            End Try
        End Try
    End Using
End Sub

注釈

このコマンドは、BEGIN TRANSACTION のSQL Server実装にマップされます。

CommitメソッドまたはRollbackメソッドを使用して、トランザクションを明示的にコミットまたはロールバックする必要があります。 SQL Server トランザクション管理モデルの .NET Framework Data Providerが正しく実行されるようにするには、SQL Serverによって提供されるトランザクション管理モデルなど、他のトランザクション管理モデルを使用しないようにします。

Note

分離レベルを指定しない場合は、既定の分離レベルが使用されます。 BeginTransaction メソッドで分離レベルを指定するには、iso パラメーター (BeginTransaction) を受け取るオーバーロードを使用します。 トランザクションに設定された分離レベルは、トランザクションが完了した後、接続が閉じられるか破棄されるまで保持されます。 スナップショット分離レベルが有効になっていない データベースで分離 レベルを Snapshot に設定しても、例外はスローされません。 トランザクションは、既定の分離レベルを使用して完了します。

Caution

トランザクションが開始され、サーバーでレベル 16 以上のエラーが発生した場合、 Read メソッドが呼び出されるまでトランザクションはロールバックされません。 ExecuteReader で例外はスローされません。

Caution

クエリが大量のデータを返し、BeginTransaction を呼び出すと、MARS の使用時に並列トランザクションが許可されないため、SQL Server SqlException がスローされます。 この問題を回避するには、リーダーを開く前に、常にトランザクションをコマンド、接続、またはその両方に関連付けます。

SQL Server トランザクションの詳細については、「Transactions (Transact-SQL)」を参照してください。

こちらもご覧ください

適用対象

BeginTransaction(IsolationLevel)

指定した分離レベルでデータベース トランザクションを開始します。

public:
 System::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::Data::IsolationLevel iso);
public System.Data.SqlClient.SqlTransaction BeginTransaction(System.Data.IsolationLevel iso);
member this.BeginTransaction : System.Data.IsolationLevel -> System.Data.SqlClient.SqlTransaction
override this.BeginTransaction : System.Data.IsolationLevel -> System.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (iso As IsolationLevel) As SqlTransaction

パラメーター

iso
IsolationLevel

トランザクションを実行する分離レベル。

返品

新しいトランザクションを表すオブジェクト。

例外

複数のアクティブな結果セット (MARS) を使用する場合、並列トランザクションは許可されません。

並列トランザクションはサポートされていません。

次の例では、 SqlConnectionSqlTransactionを作成します。 また、 BeginTransactionCommit、および Rollback メソッドの使用方法についても説明します。

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception e)
        {
            try
            {
                transaction.Rollback();
            }
            catch (SqlException ex)
            {
                if (transaction.Connection != null)
                {
                    Console.WriteLine("An exception of type " + ex.GetType() +
                        " was encountered while attempting to roll back the transaction.");
                }
            }

            Console.WriteLine("An exception of type " + e.GetType() +
                " was encountered while inserting the data.");
            Console.WriteLine("Neither record was written to database.");
        }
    }
}
Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
    Using connection As New SqlConnection(connectionString)
        connection.Open()

        Dim command As SqlCommand = connection.CreateCommand()
        Dim transaction As SqlTransaction

        ' Start a local transaction
        transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
        ' Must assign both transaction object and connection
        ' to Command object for a pending local transaction
        command.Connection = connection
        command.Transaction = transaction

        Try
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
            command.ExecuteNonQuery()
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"
            command.ExecuteNonQuery()
            transaction.Commit()
            Console.WriteLine("Both records are written to database.")
        Catch e As Exception
            Try
                transaction.Rollback()
            Catch ex As SqlException
                If Not transaction.Connection Is Nothing Then
                    Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
                      " was encountered while attempting to roll back the transaction.")
                End If
            End Try

            Console.WriteLine("An exception of type " & e.GetType().ToString() & _
              "was encountered while inserting the data.")
            Console.WriteLine("Neither record was written to database.")
        End Try
    End Using
End Sub

注釈

このコマンドは、BEGIN TRANSACTION のSQL Server実装にマップされます。

CommitメソッドまたはRollbackメソッドを使用して、トランザクションを明示的にコミットまたはロールバックする必要があります。 SQL Server トランザクション管理モデルの .NET Framework Data Providerが正しく実行されるようにするには、SQL Serverによって提供されるトランザクション管理モデルなど、他のトランザクション管理モデルを使用しないようにします。

Note

トランザクションがコミットまたはロールバックされた後、トランザクションの分離レベルは、自動コミット モード (既定のSQL Server) にある後続のすべてのコマンドに対して保持されます。 これにより、REPEATABLE READ の分離レベルが保持され、他のユーザーが行からロックされるなど、予期しない結果が生じる可能性があります。 分離レベルを既定値 (READ COMMITTED) にリセットするには、Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED ステートメントを実行するか、SqlConnection.BeginTransaction を呼び出し、その直後に SqlTransaction.Commit を呼び出します。 SQL Server分離レベルの詳細については、「Transaction 分離レベル」を参照してください。

SQL Server トランザクションの詳細については、「Transactions (Transact-SQL)」を参照してください。

Caution

クエリが大量のデータを返し、BeginTransaction を呼び出すと、MARS の使用時に並列トランザクションが許可されないため、SQL Server SqlException がスローされます。 この問題を回避するには、リーダーを開く前に、常にトランザクションをコマンド、接続、またはその両方に関連付けます。

こちらもご覧ください

適用対象

BeginTransaction(String)

指定したトランザクション名でデータベース トランザクションを開始します。

public:
 System::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::String ^ transactionName);
public System.Data.SqlClient.SqlTransaction BeginTransaction(string transactionName);
member this.BeginTransaction : string -> System.Data.SqlClient.SqlTransaction
override this.BeginTransaction : string -> System.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (transactionName As String) As SqlTransaction

パラメーター

transactionName
String

トランザクションの名前。

返品

新しいトランザクションを表すオブジェクト。

例外

複数のアクティブな結果セット (MARS) を使用する場合、並列トランザクションは許可されません。

並列トランザクションはサポートされていません。

次の例では、 SqlConnectionSqlTransactionを作成します。 また、 BeginTransactionCommit、および Rollback メソッドの使用方法についても説明します。

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction.
            try
            {
                transaction.Rollback("SampleTransaction");
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }
}
Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
    Using connection As New SqlConnection(connectionString)
        connection.Open()

        Dim command As SqlCommand = connection.CreateCommand()
        Dim transaction As SqlTransaction

        ' Start a local transaction
        transaction = connection.BeginTransaction("SampleTransaction")

        ' Must assign both transaction object and connection
        ' to Command object for a pending local transaction.
        command.Connection = connection
        command.Transaction = transaction

        Try
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
            command.ExecuteNonQuery()
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"

            command.ExecuteNonQuery()

            ' Attempt to commit the transaction.
            transaction.Commit()
            Console.WriteLine("Both records are written to database.")

        Catch ex As Exception
            Console.WriteLine("Exception Type: {0}", ex.GetType())
            Console.WriteLine("  Message: {0}", ex.Message)

            ' Attempt to roll back the transaction.
            Try
                transaction.Rollback("SampleTransaction")

            Catch ex2 As Exception
                ' This catch block will handle any errors that may have occurred
                ' on the server that would cause the rollback to fail, such as
                ' a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
                Console.WriteLine("  Message: {0}", ex2.Message)
            End Try
        End Try
    End Using
End Sub

注釈

このコマンドは、BEGIN TRANSACTION のSQL Server実装にマップされます。

transactionName パラメーターの長さは 32 文字を超えないようにしてください。それ以外の場合は例外がスローされます。

transactionName パラメーターの値は、後でRollbackする呼び出しや、Save メソッドの savePoint パラメーターで使用できます。

CommitメソッドまたはRollbackメソッドを使用して、トランザクションを明示的にコミットまたはロールバックする必要があります。 SQL Server トランザクション管理モデルの .NET Framework Data Providerが正しく実行されるようにするには、SQL Serverによって提供されるトランザクション管理モデルなど、他のトランザクション管理モデルを使用しないようにします。

SQL Server トランザクションの詳細については、「Transactions (Transact-SQL)」を参照してください。

Caution

クエリが大量のデータを返し、BeginTransaction を呼び出すと、MARS の使用時に並列トランザクションが許可されないため、SQL Server SqlException がスローされます。 この問題を回避するには、リーダーを開く前に、常にトランザクションをコマンド、接続、またはその両方に関連付けます。

こちらもご覧ください

適用対象

BeginTransaction(IsolationLevel, String)

分離レベルとトランザクション名を指定してデータベース トランザクションを開始します。

public:
 System::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::Data::IsolationLevel iso, System::String ^ transactionName);
public System.Data.SqlClient.SqlTransaction BeginTransaction(System.Data.IsolationLevel iso, string transactionName);
member this.BeginTransaction : System.Data.IsolationLevel * string -> System.Data.SqlClient.SqlTransaction
override this.BeginTransaction : System.Data.IsolationLevel * string -> System.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (iso As IsolationLevel, transactionName As String) As SqlTransaction

パラメーター

iso
IsolationLevel

トランザクションを実行する分離レベル。

transactionName
String

トランザクションの名前。

返品

新しいトランザクションを表すオブジェクト。

例外

複数のアクティブな結果セット (MARS) を使用する場合、並列トランザクションは許可されません。

並列トランザクションはサポートされていません。

次の例では、 SqlConnectionSqlTransactionを作成します。 また、 BeginTransactionCommit、および Rollback メソッドの使用方法についても説明します。

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction(
            IsolationLevel.ReadCommitted, "SampleTransaction");

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction.
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception e)
        {
            try
            {
                transaction.Rollback("SampleTransaction");
            }
            catch (SqlException ex)
            {
                if (transaction.Connection != null)
                {
                    Console.WriteLine("An exception of type " + ex.GetType() +
                        " was encountered while attempting to roll back the transaction.");
                }
            }

            Console.WriteLine("An exception of type " + e.GetType() +
                " was encountered while inserting the data.");
            Console.WriteLine("Neither record was written to database.");
        }
    }
}
Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
    Using connection As New SqlConnection(connectionString)
        connection.Open()

        Dim command As SqlCommand = connection.CreateCommand()
        Dim transaction As SqlTransaction

        ' Start a local transaction.
        transaction = connection.BeginTransaction( _
          IsolationLevel.ReadCommitted, "SampleTransaction")

        ' Must assign both transaction object and connection
        ' to Command object for a pending local transaction.
        command.Connection = connection
        command.Transaction = transaction

        Try
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
            command.ExecuteNonQuery()
            command.CommandText = _
              "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"
            command.ExecuteNonQuery()
            transaction.Commit()
            Console.WriteLine("Both records are written to database.")
        Catch e As Exception
            Try
                transaction.Rollback("SampleTransaction")
            Catch ex As SqlException
                If Not transaction.Connection Is Nothing Then
                    Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
                      " was encountered while attempting to roll back the transaction.")
                End If
            End Try

            Console.WriteLine("An exception of type " & e.GetType().ToString() & _
              "was encountered while inserting the data.")
            Console.WriteLine("Neither record was written to database.")
        End Try
    End Using
End Sub

注釈

このコマンドは、BEGIN TRANSACTION のSQL Server実装にマップされます。

transactionName パラメーターの値は、後でRollbackする呼び出しや、Save メソッドの savePoint パラメーターで使用できます。

CommitメソッドまたはRollbackメソッドを使用して、トランザクションを明示的にコミットまたはロールバックする必要があります。 SQL Server トランザクション管理モデルが正しく実行されるようにするには、SQL Serverによって提供されるトランザクション管理モデルなど、他のトランザクション管理モデルを使用しないようにします。

Note

トランザクションがコミットまたはロールバックされた後、トランザクションの分離レベルは、自動コミット モード (既定のSQL Server) にある後続のすべてのコマンドに対して保持されます。 これにより、REPEATABLE READ の分離レベルが保持され、他のユーザーが行からロックされるなど、予期しない結果が生じる可能性があります。 分離レベルを既定値 (READ COMMITTED) にリセットするには、Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED ステートメントを実行するか、SqlConnection.BeginTransaction を呼び出し、その直後に SqlTransaction.Commit を呼び出します。 SQL Server分離レベルの詳細については、「Transaction 分離レベル」を参照してください。

SQL Server トランザクションの詳細については、「Transactions (Transact-SQL)」を参照してください。

Caution

クエリが大量のデータを返し、BeginTransaction を呼び出すと、MARS の使用時に並列トランザクションが許可されないため、SQL Server SqlException がスローされます。 この問題を回避するには、リーダーを開く前に、常にトランザクションをコマンド、接続、またはその両方に関連付けます。

こちらもご覧ください

適用対象