Transazioni localiLocal Transactions

Le transazioni in ADO.NETADO.NET consentono di associare più attività in modo da poterle eseguire come un'unità di lavoro singola.Transactions in ADO.NETADO.NET are used when you want to bind multiple tasks together so that they execute as a single unit of work. Ad esempio, si supponga che un'applicazione esegua due attività.For example, imagine that an application performs two tasks. Ovvero che prima aggiorni una tabella con le informazioni sull'ordineFirst, it updates a table with order information. e che, successivamente, aggiorni una tabella contenente le informazioni d'inventario addebitando gli articoli ordinati.Second, it updates a table that contains inventory information, debiting the items ordered. Se l'attività ha esito negativo, quindi entrambi gli aggiornamenti di rollback.If either task fails, then both updates are rolled back.

Determinazione del tipo di transazioneDetermining the Transaction Type

Una transazione viene considerata come una transazione locale quando è a fase singola e viene gestita direttamente dal database.A transaction is considered to be a local transaction when it is a single-phase transaction and is handled by the database directly. Una transazione viene considerata come una transazione distribuita quando è coordinata da un monitoraggio delle transazioni e utilizza i meccanismi fail-safe (quale il commit in due fasi) per la risoluzione delle transazioni.A transaction is considered to be a distributed transaction when it is coordinated by a transaction monitor and uses fail-safe mechanisms (such as two-phase commit) for transaction resolution.

Ogni provider di dati .NET Framework.NET Framework dispone di un oggetto Transaction per l'esecuzione delle transazioni locali.Each of the .NET Framework.NET Framework data providers has its own Transaction object for performing local transactions. Per eseguire una transazione in un database di SQL Server, selezionare una transazione System.Data.SqlClient.If you require a transaction to be performed in a SQL Server database, select a System.Data.SqlClient transaction. Per una transazione Oracle usare il provider System.Data.OracleClient.For an Oracle transaction, use the System.Data.OracleClient provider. Inoltre, è un DbTransaction classe disponibile per la scrittura di codice indipendente dal provider che richiede transazioni.In addition, there is a DbTransaction class that is available for writing provider-independent code that requires transactions.

Nota

Le transazioni più efficienti sono quelle eseguite sul server.Transactions are most efficient when it is performed on the server. Se si usa un database SQL Server in cui sono ampiamente usate le transazioni esplicite, è consigliabile scrivere queste transazioni come stored procedure usando l'istruzione BEGIN TRANSACTION Transact-SQL.If you are working with a SQL Server database that makes extensive use of explicit transactions, consider writing them as stored procedures using the Transact-SQL BEGIN TRANSACTION statement. Per altre informazioni sull'esecuzione di transazioni sul lato server, vedere la documentazione online di SQL Server.For more information about performing server-side transactions, see SQL Server Books Online.

Esecuzione di una transazione con una singola connessionePerforming a Transaction Using a Single Connection

In ADO.NETADO.NET è possibile controllare le transazioni mediante l'oggetto Connection.In ADO.NETADO.NET, you control transactions with the Connection object. È possibile avviare una transazione locale con il metodo BeginTransaction.You can initiate a local transaction with the BeginTransaction method. Una volta iniziata una transazione, è possibile inserire un comando nell'elenco della transazione usando la proprietà Transaction di un oggetto Command.Once you have begun a transaction, you can enlist a command in that transaction with the Transaction property of a Command object. In seguito è possibile eseguire il commit o il rollback delle modifiche apportate nell'origine dati in base all'esito corretto o errato dei componenti della transazione.You can then commit or roll back modifications made at the data source based on the success or failure of the components of the transaction.

Nota

Il metodo EnlistDistributedTransaction non deve essere usato per una transazione locale.The EnlistDistributedTransaction method should not be used for a local transaction.

L'ambito della transazione si limita alla connessione.The scope of the transaction is limited to the connection. Nell'esempio seguente viene eseguita una transazione esplicita composta da due comandi separati nel blocco try.The following example performs an explicit transaction that consists of two separate commands in the try block. I comandi eseguono le istruzioni INSERT sulla tabella Production. ScrapReason nel database di esempio AdventureWorks di SQL Server, viene eseguito il commit non vengono generate eccezioni.The commands execute INSERT statements against the Production.ScrapReason table in the AdventureWorks SQL Server sample database, which are committed if no exceptions are thrown. Se, invece, viene generata un'eccezione, il codice del blocco catch esegue il rollback della transazione.The code in the catch block rolls back the transaction if an exception is thrown. Allo stesso modo, se la transazione viene interrotta oppure la connessione viene chiusa prima del completamento della transazione, viene eseguito automaticamente il rollback della transazione.If the transaction is aborted or the connection is closed before the transaction has completed, it is automatically rolled back.

EsempioExample

Per eseguire una transazione, usare la procedura seguente:Follow these steps to perform a transaction.

  1. Chiamare il metodo BeginTransaction dell'oggetto SqlConnection per contrassegnare l'inizio della transazione.Call the BeginTransaction method of the SqlConnection object to mark the start of the transaction. Il metodo BeginTransaction restituisce un riferimento alla transazione.The BeginTransaction method returns a reference to the transaction. Questo riferimento viene assegnato agli oggetti SqlCommand contenuti nell'elenco della transazione.This reference is assigned to the SqlCommand objects that are enlisted in the transaction.

  2. Assegnare l'oggetto Transaction alla proprietà Transaction dell'oggetto SqlCommand da eseguire.Assign the Transaction object to the Transaction property of the SqlCommand to be executed. Se un comando viene eseguito su una connessione con una transazione attiva e l'oggetto Transaction non è stato assegnato alla proprietà Transaction dell'oggetto Command, viene generata un'eccezione.If a command is executed on a connection with an active transaction, and the Transaction object has not been assigned to the Transaction property of the Command object, an exception is thrown.

  3. Eseguire i comandi richiesti.Execute the required commands.

  4. Chiamare il metodo Commit dell'oggetto SqlTransaction per completare la transazione oppure il metodo Rollback per interrompere la transazione.Call the Commit method of the SqlTransaction object to complete the transaction, or call the Rollback method to end the transaction. Se la connessione viene chiusa o eliminata prima che venga eseguito il metodo Commit o Rollback, viene eseguito il rollback della transazione.If the connection is closed or disposed before either the Commit or Rollback methods have been executed, the transaction is rolled back.

Nell'esempio di codice seguente viene illustrata la logica transazionale usando ADO.NETADO.NET con Microsoft SQL Server.The following code example demonstrates transactional logic using ADO.NETADO.NET with Microsoft SQL Server.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

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

    // Enlist a command in the current transaction.
    SqlCommand command = connection.CreateCommand();
    command.Transaction = sqlTran;

    try
    {
        // Execute two separate commands.
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
        command.ExecuteNonQuery();
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
        command.ExecuteNonQuery();

        // Commit the transaction.
        sqlTran.Commit();
        Console.WriteLine("Both records were written to database.");
    }
    catch (Exception ex)
    {
        // Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message);

        try
        {
            // Attempt to roll back the transaction.
            sqlTran.Rollback();
        }
        catch (Exception exRollback)
        {
            // Throws an InvalidOperationException if the connection 
            // is closed or the transaction has already been rolled 
            // back on the server.
            Console.WriteLine(exRollback.Message);
        }
    }
}
Using connection As New SqlConnection(connectionString)
    connection.Open()

    ' Start a local transaction.
    Dim sqlTran As SqlTransaction = connection.BeginTransaction()

    ' Enlist a command in the current transaction.
    Dim command As SqlCommand = connection.CreateCommand()
    command.Transaction = sqlTran

    Try
        ' Execute two separate commands.
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')"
        command.ExecuteNonQuery()
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')"
        command.ExecuteNonQuery()

        ' Commit the transaction
        sqlTran.Commit()
        Console.WriteLine("Both records were written to database.")

    Catch ex As Exception
        ' Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message)

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

        Catch exRollback As Exception
            ' Throws an InvalidOperationException if the connection 
            ' is closed or the transaction has already been rolled 
            ' back on the server.
            Console.WriteLine(exRollback.Message)
        End Try
    End Try
End Using

Vedere ancheSee Also

Transazioni e concorrenzaTransactions and Concurrency
Transazioni distribuiteDistributed Transactions
Integrazione di System.Transactions con SQL ServerSystem.Transactions Integration with SQL Server
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center