Бөлісу құралы:


SqlConnection.BeginTransaction Метод

Определение

Начинает транзакцию базы данных.

Перегрузки

BeginTransaction()

Начинает транзакцию базы данных.

BeginTransaction(IsolationLevel)

Начинает транзакцию базы данных с указанным уровнем изоляции.

BeginTransaction(String)

Начинает транзакцию базы данных с указанным уровнем изоляции.

BeginTransaction(IsolationLevel, String)

Начинает транзакцию базы данных с указанным уровнем изоляции и именем транзакции.

BeginTransaction()

Начинает транзакцию базы данных.

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

Возвращаемое значение

Объект, представляющий новую транзакцию.

Исключения

Параллельные транзакции не разрешены при использовании режима MARS.

Параллельные транзакции не поддерживаются.

Примеры

В следующем примере производится создание объектов SqlConnection и SqlTransaction. В нем также показано, как использовать BeginTransactionметоды , и RollbackCommit.

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

Комментарии

Эта команда сопоставляется с реализацией SQL Server BEGIN TRANSACTION.

Должны быть явным образом произведены фиксация или откат транзакции методом Commit или Rollback. Чтобы убедиться, что модель управления транзакциями платформа .NET Framework поставщика данных для SQL Server работает правильно, избегайте использования других моделей управления транзакциями, таких как модель, предоставляемую SQL Server.

Примечание

Если уровень изоляции не указан, используется уровень изоляции по умолчанию. Чтобы указать уровень изоляции с BeginTransaction помощью метода , используйте перегрузку iso , которая принимает параметр (BeginTransaction). Уровень изоляции, заданный для транзакции, сохраняется после завершения транзакции и до тех пор, пока подключение не будет закрыто или удалено. Установка уровня изоляции в моментальный снимок в базе данных, где не включен уровень изоляции snapshot, не вызывает исключения. Транзакция завершится с использованием уровня изоляции по умолчанию.

Внимание!

Если транзакция запущена и на сервере возникает ошибка уровня 16 или выше, откат транзакции не будет выполняться до Read вызова метода . В ExecuteReader не возникает никаких исключений.

Внимание!

Когда запрос возвращает большой объем данных и вызывает BeginTransaction, возникает исключение , SqlException так как SQL Server не допускает параллельные транзакции при использовании MARS. Чтобы избежать этой проблемы, всегда свяжите транзакцию с командой, соединением или и тем, и другим, прежде чем будут открыты какие-либо средства чтения.

Дополнительные сведения о транзакциях SQL Server см. в разделе Транзакции (Transact-SQL).

См. также раздел

Применяется к

BeginTransaction(IsolationLevel)

Начинает транзакцию базы данных с указанным уровнем изоляции.

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

Параметры

iso
IsolationLevel

Уровень изоляции, с которым должна выполняться транзакция.

Возвращаемое значение

Объект, представляющий новую транзакцию.

Исключения

Параллельные транзакции не разрешены при использовании режима MARS.

Параллельные транзакции не поддерживаются.

Примеры

В следующем примере производится создание объектов SqlConnection и SqlTransaction. В нем также показано, как использовать BeginTransactionметоды , и RollbackCommit.

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

Комментарии

Эта команда сопоставляется с реализацией SQL Server BEGIN TRANSACTION.

Должны быть явным образом произведены фиксация или откат транзакции методом Commit или Rollback. Чтобы убедиться, что модель управления транзакциями платформа .NET Framework поставщика данных для SQL Server работает правильно, избегайте использования других моделей управления транзакциями, таких как модель, предоставляемую SQL Server.

Примечание

После фиксации или отката транзакции уровень изоляции транзакции сохраняется для всех последующих команд, которые находятся в режиме автоматической фиксации (SQL Server по умолчанию). Это может привести к непредвиденным результатам, таким как сохранение уровня изоляции REPEATABLE READ и блокировка других пользователей из строки. Чтобы сбросить уровень изоляции до уровня по умолчанию (READ COMMITTED), выполните инструкцию Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED или немедленно SqlTransaction.Commitвызовите SqlConnection.BeginTransaction . Дополнительные сведения об уровнях изоляции SQL Server см. в разделе Уровни изоляции транзакций.

Дополнительные сведения о транзакциях SQL Server см. в разделе Транзакции (Transact-SQL).

Внимание!

Когда запрос возвращает большой объем данных и вызывает BeginTransaction, возникает исключение , SqlException так как SQL Server не допускает параллельные транзакции при использовании MARS. Чтобы избежать этой проблемы, всегда свяжите транзакцию с командой, соединением или и тем, и другим, прежде чем будут открыты какие-либо средства чтения.

См. также раздел

Применяется к

BeginTransaction(String)

Начинает транзакцию базы данных с указанным уровнем изоляции.

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

Параметры

transactionName
String

Имя транзакции.

Возвращаемое значение

Объект, представляющий новую транзакцию.

Исключения

Параллельные транзакции не разрешены при использовании режима MARS.

Параллельные транзакции не поддерживаются.

Примеры

В следующем примере производится создание объектов SqlConnection и SqlTransaction. В нем также показано, как использовать BeginTransactionметоды , и RollbackCommit.

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

Комментарии

Эта команда сопоставляется с реализацией SQL Server BEGIN TRANSACTION.

Длина transactionName параметра не должна превышать 32 символа; в противном случае возникнет исключение.

Значение в параметре transactionName можно использовать в последующих вызовах Rollback и в savePoint параметре Save метода .

Должны быть явным образом произведены фиксация или откат транзакции методом Commit или Rollback. Чтобы убедиться, что модель управления транзакциями платформа .NET Framework поставщика данных для SQL Server работает правильно, избегайте использования других моделей управления транзакциями, таких как модель, предоставляемую SQL Server.

Дополнительные сведения о транзакциях SQL Server см. в разделе Транзакции (Transact-SQL).

Внимание!

Когда запрос возвращает большой объем данных и вызывает BeginTransaction, возникает исключение , SqlException так как SQL Server не допускает параллельные транзакции при использовании MARS. Чтобы избежать этой проблемы, всегда свяжите транзакцию с командой, соединением или и тем, и другим, прежде чем будут открыты какие-либо средства чтения.

См. также раздел

Применяется к

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);
override this.BeginTransaction : System.Data.IsolationLevel * string -> System.Data.SqlClient.SqlTransaction
member 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.

Параллельные транзакции не поддерживаются.

Примеры

В следующем примере производится создание объектов SqlConnection и SqlTransaction. В нем также показано, как использовать BeginTransactionметоды , и RollbackCommit.

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

Комментарии

Эта команда сопоставляется с реализацией SQL Server BEGIN TRANSACTION.

Значение в параметре transactionName можно использовать в последующих вызовах Rollback и в savePoint параметре Save метода .

Должны быть явным образом произведены фиксация или откат транзакции методом Commit или Rollback. Чтобы убедиться, что модель управления транзакциями SQL Server работает правильно, не используйте другие модели управления транзакциями, например модели, предоставляемые SQL Server.

Примечание

После фиксации или отката транзакции уровень изоляции транзакции сохраняется для всех последующих команд, которые находятся в режиме автоматической фиксации (SQL Server по умолчанию). Это может привести к непредвиденным результатам, таким как сохранение уровня изоляции REPEATABLE READ и блокировка других пользователей из строки. Чтобы сбросить уровень изоляции до уровня по умолчанию (READ COMMITTED), выполните инструкцию Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED или немедленно SqlTransaction.Commitвызовите SqlConnection.BeginTransaction . Дополнительные сведения об уровнях изоляции SQL Server см. в разделе Уровни изоляции транзакций.

Дополнительные сведения о транзакциях SQL Server см. в разделе Транзакции (Transact-SQL).

Внимание!

Когда запрос возвращает большой объем данных и вызывает BeginTransaction, возникает исключение , SqlException так как SQL Server не допускает параллельные транзакции при использовании MARS. Чтобы избежать этой проблемы, всегда свяжите транзакцию с командой, соединением или и тем, и другим, прежде чем будут открыты какие-либо средства чтения.

См. также раздел

Применяется к