Поделиться через


SqlConnection.BeginTransaction Метод

Определение

Перегрузки

BeginTransaction()

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

BeginTransaction(IsolationLevel)

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

BeginTransaction(String)

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

BeginTransaction(IsolationLevel, String)

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

BeginTransaction()

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

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

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

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

Исключения

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

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

Примеры

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

using Microsoft.Data.SqlClient;

namespace Transaction1CS
{
    class Program
    {
        static void Main()
        {
            string connectionString =
                "Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
            ExecuteSqlTransaction(connectionString);
            Console.ReadLine();
        }
        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);
                    }
                }
            }
        }
    }
}

Комментарии

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

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

Примечание

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

Внимание!

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

Внимание!

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

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

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

BeginTransaction(IsolationLevel)

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

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

Параметры

iso
IsolationLevel

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

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

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

Исключения

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

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

Примеры

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

using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString =
            "Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
        ExecuteSqlTransaction(connectionString);
        Console.ReadLine();
    }
    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.");
            }
        }
    }
}

Комментарии

Эта команда сопоставляется с реализацией 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:
 Microsoft::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::String ^ transactionName);
public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction (string transactionName);
override this.BeginTransaction : string -> Microsoft.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (transactionName As String) As SqlTransaction

Параметры

transactionName
String

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

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

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

Исключения

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

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

Примеры

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

using Microsoft.Data.SqlClient;

namespace Transaction1CS
{
    class Program
    {
        static void Main()
        {
            string connectionString =
                "Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
            ExecuteSqlTransaction(connectionString);
            Console.ReadLine();
        }
        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);
                    }
                }
            }
        }
    }
}

Комментарии

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

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

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

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

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

Внимание!

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

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

BeginTransaction(IsolationLevel, String)

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

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

Параметры

iso
IsolationLevel

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

transactionName
String

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

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

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

Исключения

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

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

Примеры

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

using Microsoft.Data.SqlClient;

namespace Transaction1CS
{
    class Program
    {
        static void Main()
        {
            string connectionString =
                "Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
            ExecuteSqlTransaction(connectionString);
            Console.ReadLine();
        }
        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.");
                }
            }
        }
    }
}

Комментарии

Эта команда сопоставляется с реализацией 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. Чтобы избежать этой проблемы, всегда свяжите транзакцию с командой, соединением или и тем, и другим, прежде чем будут открыты какие-либо средства чтения.

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