Partilhar via


SqlConnection.BeginTransaction Método

Definição

Inicia uma transação de banco de dados.

Sobrecargas

BeginTransaction()

Inicia uma transação de banco de dados.

BeginTransaction(IsolationLevel)

Inicia uma transação de banco de dados com o nível de isolamento especificado.

BeginTransaction(String)

Inicia uma transação de banco de dados com o nome da transação especificado.

BeginTransaction(IsolationLevel, String)

Inicia uma transação de banco de dados com o nível de isolamento e nome de transação especificados.

BeginTransaction()

Inicia uma transação de banco de dados.

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

Retornos

Um objeto que representa a nova transação.

Exceções

Não são permitidas transações paralelas ao usar MARS (Multiple Active Result Sets).

Não há suporte para transações paralelas.

Exemplos

O exemplo a seguir cria um SqlConnection e um SqlTransaction. Ele também demonstra como usar os BeginTransactionmétodos , um Commite 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

Comentários

Esse comando é mapeado para a implementação SQL Server de BEGIN TRANSACTION.

Você deve confirmar ou reverter explicitamente a transação usando o Commit método ou Rollback . Para garantir que o provedor de dados .NET Framework para SQL Server modelo de gerenciamento de transações seja executado corretamente, evite usar outros modelos de gerenciamento de transações, como o fornecido pelo SQL Server.

Observação

Se você não especificar um nível de isolamento, o nível de isolamento padrão será usado. Para especificar um nível de isolamento com o BeginTransaction método , use a sobrecarga que usa o iso parâmetro (BeginTransaction). O nível de isolamento definido para uma transação persiste após a conclusão da transação e até que a conexão seja fechada ou descartada. Definir o nível de isolamento como Instantâneo em um banco de dados em que o nível de isolamento instantâneo não está habilitado não gera uma exceção. A transação será concluída usando o nível de isolamento padrão.

Cuidado

Se uma transação for iniciada e ocorrer um erro de nível 16 ou superior no servidor, a transação não será revertida até que o Read método seja invocado. Nenhuma exceção é gerada no ExecuteReader.

Cuidado

Quando a consulta retorna uma grande quantidade de dados e chama BeginTransaction, um SqlException é gerado porque SQL Server não permite transações paralelas ao usar MARS. Para evitar esse problema, sempre associe uma transação ao comando , à conexão ou a ambos antes que os leitores estejam abertos.

Para obter mais informações sobre transações SQL Server, consulte Transações (Transact-SQL).

Confira também

Aplica-se a

BeginTransaction(IsolationLevel)

Inicia uma transação de banco de dados com o nível de isolamento especificado.

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

Parâmetros

iso
IsolationLevel

O nível de isolamento em que a transação deve ser executada.

Retornos

Um objeto que representa a nova transação.

Exceções

Não são permitidas transações paralelas ao usar MARS (Multiple Active Result Sets).

Não há suporte para transações paralelas.

Exemplos

O exemplo a seguir cria um SqlConnection e um SqlTransaction. Ele também demonstra como usar os BeginTransactionmétodos , um Commite 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

Comentários

Esse comando é mapeado para a implementação SQL Server de BEGIN TRANSACTION.

Você deve confirmar ou reverter explicitamente a transação usando o Commit método ou Rollback . Para garantir que o provedor de dados .NET Framework para SQL Server modelo de gerenciamento de transações seja executado corretamente, evite usar outros modelos de gerenciamento de transações, como o fornecido pelo SQL Server.

Observação

Depois que uma transação é confirmada ou revertida, o nível de isolamento da transação persiste para todos os comandos subsequentes que estão no modo de confirmação automática (o padrão SQL Server). Isso pode produzir resultados inesperados, como um nível de isolamento de REPEATABLE READ persistindo e bloqueando outros usuários fora de uma linha. Para redefinir o nível de isolamento para o padrão (READ COMMITTED), execute a instrução TRANSact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED ou chame SqlConnection.BeginTransaction seguida imediatamente por SqlTransaction.Commit. Para obter mais informações sobre SQL Server níveis de isolamento, consulte Níveis de isolamento da transação.

Para obter mais informações sobre transações SQL Server, consulte Transações (Transact-SQL).

Cuidado

Quando a consulta retorna uma grande quantidade de dados e chama BeginTransaction, um SqlException é gerado porque SQL Server não permite transações paralelas ao usar MARS. Para evitar esse problema, sempre associe uma transação ao comando , à conexão ou a ambos antes que os leitores estejam abertos.

Confira também

Aplica-se a

BeginTransaction(String)

Inicia uma transação de banco de dados com o nome da transação especificado.

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

Parâmetros

transactionName
String

O nome da transação.

Retornos

Um objeto que representa a nova transação.

Exceções

Não são permitidas transações paralelas ao usar MARS (Multiple Active Result Sets).

Não há suporte para transações paralelas.

Exemplos

O exemplo a seguir cria um SqlConnection e um SqlTransaction. Ele também demonstra como usar os BeginTransactionmétodos , um Commite 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

Comentários

Esse comando é mapeado para a implementação SQL Server de BEGIN TRANSACTION.

O comprimento do transactionName parâmetro não deve exceder 32 caracteres; caso contrário, uma exceção será gerada.

O valor no transactionName parâmetro pode ser usado em chamadas posteriores para Rollback e no savePoint parâmetro do Save método .

Você deve confirmar ou reverter explicitamente a transação usando o Commit método ou Rollback . Para garantir que o provedor de dados .NET Framework para SQL Server modelo de gerenciamento de transações seja executado corretamente, evite usar outros modelos de gerenciamento de transações, como o fornecido pelo SQL Server.

Para obter mais informações sobre transações SQL Server, consulte Transações (Transact-SQL).

Cuidado

Quando a consulta retorna uma grande quantidade de dados e chama BeginTransaction, um SqlException é gerado porque SQL Server não permite transações paralelas ao usar MARS. Para evitar esse problema, sempre associe uma transação ao comando , à conexão ou a ambos antes que os leitores estejam abertos.

Confira também

Aplica-se a

BeginTransaction(IsolationLevel, String)

Inicia uma transação de banco de dados com o nível de isolamento e nome de transação especificados.

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

Parâmetros

iso
IsolationLevel

O nível de isolamento em que a transação deve ser executada.

transactionName
String

O nome da transação.

Retornos

Um objeto que representa a nova transação.

Exceções

Não são permitidas transações paralelas ao usar MARS (Multiple Active Result Sets).

Não há suporte para transações paralelas.

Exemplos

O exemplo a seguir cria um SqlConnection e um SqlTransaction. Ele também demonstra como usar os BeginTransactionmétodos , um Commite 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

Comentários

Esse comando é mapeado para a implementação SQL Server de BEGIN TRANSACTION.

O valor no transactionName parâmetro pode ser usado em chamadas posteriores para Rollback e no savePoint parâmetro do Save método .

Você deve confirmar ou reverter explicitamente a transação usando o Commit método ou Rollback . Para garantir que o modelo de gerenciamento de transações SQL Server seja executado corretamente, evite usar outros modelos de gerenciamento de transações, como o fornecido pelo SQL Server.

Observação

Depois que uma transação é confirmada ou revertida, o nível de isolamento da transação persiste para todos os comandos subsequentes que estão no modo de confirmação automática (o padrão SQL Server). Isso pode produzir resultados inesperados, como um nível de isolamento de REPEATABLE READ persistindo e bloqueando outros usuários fora de uma linha. Para redefinir o nível de isolamento para o padrão (READ COMMITTED), execute a instrução TRANSact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED ou chame SqlConnection.BeginTransaction seguida imediatamente por SqlTransaction.Commit. Para obter mais informações sobre SQL Server níveis de isolamento, consulte Níveis de isolamento da transação.

Para obter mais informações sobre transações SQL Server, consulte Transações (Transact-SQL).

Cuidado

Quando a consulta retorna uma grande quantidade de dados e chama BeginTransaction, um SqlException é gerado porque SQL Server não permite transações paralelas ao usar MARS. Para evitar esse problema, sempre associe uma transação ao comando , à conexão ou a ambos antes que os leitores estejam abertos.

Confira também

Aplica-se a