Transazioni di Integration ServicesIntegration Services Transactions

Nei pacchetti vengono utilizzate transazioni per l'associazione di azioni del database eseguite dalle attività in unità atomiche in modo da mantenere l'integrità dei dati.Packages use transactions to bind the database actions that tasks perform into atomic units, and by doing this maintain data integrity. Tutti i tipi di contenitori di MicrosoftMicrosoft Integration ServicesIntegration Services , ovvero pacchetti, ciclo For, ciclo Foreach, contenitori Sequenza, nonché gli host di attività in cui è incapsulata ogni attività, possono essere configurati per l'uso delle transazioni.All MicrosoftMicrosoft Integration ServicesIntegration Services container types—packages, the For Loop, Foreach Loop, and Sequence containers, and the task hosts that encapsulate each task—can be configured to use transactions. Integration ServicesIntegration Services sono disponibili tre opzioni per la configurazione delle transazioni: NotSupported, Supportede Required. provides three options for configuring transactions: NotSupported, Supported, and Required.

  • L'opzioneRequired indica che il contenitore avvia una transazione, a meno che il contenitore padre non abbia già avviato un'altra transazione.Required indicates that the container starts a transaction, unless one is already started by its parent container. In questo caso, il contenitore parteciperà alla transazione in corso.If a transaction already exists, the container joins the transaction. Si supponga, ad esempio, che un pacchetto includa un contenitore Sequenza con l'opzione Required . Se il pacchetto non è stato configurato per il supporto di transazioni, il contenitore avvierà la propria transazione.For example, if a package that is not configured to support transactions includes a Sequence container that uses the Required option, the Sequence container would start its own transaction. Se per il pacchetto è stata impostata l'opzione Required , il contenitore Sequenza parteciperà alla transazione del pacchetto.If the package were configured to use the Required option, the Sequence container would join the package transaction.

  • L'opzioneSupported indica che il contenitore non avvia una transazione, ma partecipa alla transazione avviata dal contenitore padre.Supported indicates that the container does not start a transaction, but joins any transaction started by its parent container. Si supponga, ad esempio, che un pacchetto includa quattro attività Esegui SQL con l'opzione Supported e che il pacchetto avvii una transazione. In questo caso, se una delle attività Esegui SQL ha esito negativo viene eseguito il rollback degli aggiornamenti del database eseguiti dalle attività.For example, if a package with four Execute SQL tasks starts a transaction and all four tasks use the Supported option, the database updates performed by the Execute SQL tasks are rolled back if any task fails. Nel caso di un pacchetto che non avvia una transazione, le quattro attività Esegui SQL risultano non associate ad alcuna transazione. Di conseguenza viene eseguito il rollback solo degli aggiornamenti del database eseguiti dall'attività che ha esito negativo.If the package does not start a transaction, the four Execute SQL tasks are not bound by a transaction, and no database updates except the ones performed by the failed task are rolled back.

  • L'opzioneNotSupported indica che il contenitore non avvia una transazione e non partecipa ad una transazione in corso.NotSupported indicates that the container does not start a transaction or join an existing transaction. Una transazione avviata da un contenitore padre non ha alcun effetto sui contenitori figlio non configurati per il supporto di transazioni.A transaction started by a parent container does not affect child containers that have been configured to not support transactions. Si supponga, ad esempio, che un pacchetto sia configurato per l'avvio di una transazione e che per un contenitore Ciclo For del pacchetto sia impostata l'opzione NotSupported . In questo caso, se le attività del Ciclo For hanno esito negativo non è possibile eseguire il rollback di nessuna attività.For example, if a package is configured to start a transaction and a For Loop container in the package uses the NotSupported option, none of the tasks in the For Loop can roll back if they fail.

    Per configurare le transazioni, è necessario impostare la proprietà TransactionOption del contenitore.You configure transactions by setting the TransactionOption property on the container. È possibile eseguire questa operazione nella finestra Proprietà di SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT)o a livello di codice.You can set this property by using the Properties window in SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT), or you can set the property programmatically.

Nota

La proprietà TransactionOption può determinare se il valore della proprietà IsolationLevel richiesta da un contenitore viene applicato o meno.The TransactionOption property influences whether or not the value of the IsolationLevel property requested by a container is applied. Per altre informazioni, vedere la descrizione della proprietà IsolationLevel nell'argomento Impostazione delle proprietà di un pacchetto.For more information, see the description of the IsolationLevel property in the topic, Setting Package Properties.

Configurazione di un pacchetto per l'utilizzo di transazioniConfigure a package to use transactions

Quando si configura un pacchetto per l'utilizzo di transazioni, sono disponibili due opzioni:When you configure a package to use transactions, you have two options:

  • Utilizzare una sola transazione per il pacchetto.Have a single transaction for the package. In questo caso, è il pacchetto stesso che inizializza questa transazione, mentre le singole attività e i contenitori del pacchetto partecipano a questa unica transazione.In this case, it is the package itself that initiates this transaction, whereas individual tasks and containers in the package participate in this single transaction.

  • Utilizzare più transazioni nel pacchetto.Have multiple transactions in the package. In questo caso, il pacchetto supporta le transazioni, ma sono le singole attività e i contenitori del pacchetto a inizializzare le transazioni.In this case, the package supports transactions, but individual tasks and containers in the package actually initiate the transactions.

    Nelle procedure seguenti viene descritto come configurare entrambe le opzioni.The following procedures describe how to configure both options.

Configurare un pacchetto per l'utilizzo di una singola transazioneConfigure a package to use a single transaction

In questo caso, il pacchetto stesso inizializza un'unica transazione.In this option, the package itself initiates a single transaction. È necessario configurare il pacchetto in modo che inizializzi questa transazione impostando la proprietà TransactionOption del pacchetto su Required.You configure the package to initiate this transaction by setting the TransactionOption property of the package to Required.

In questa unica transazione verranno quindi inserite le attività e i contenitori specifici.Next, you enlist specific tasks and containers in this single transaction. Per inserire un'attività o un contenitore in una transazione, è necessario impostare la proprietà TransactionOption dell'attività o del contenitore su Supported.To enlist a task or container in a transaction, you set the TransactionOption property of that task or container to Supported.

  1. In SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT)aprire il progetto di Integration ServicesIntegration Services contenente il pacchetto che si desidera configurare per l'utilizzo di una transazione.In SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT), open the Integration ServicesIntegration Services project that contains the package you want to configure to use a transaction.

  2. In Esplora soluzioni fare doppio clic sul pacchetto per aprirlo.In Solution Explorer, double-click the package to open it.

  3. Fare clic sulla scheda Flusso di controllo .Click the Control Flow tab.

  4. Fare clic con il pulsante destro del mouse in un punto qualsiasi dello sfondo dell'area di progettazione del flusso di controllo e quindi scegliere Proprietà.Right-click anywhere in the background of the control flow design surface, and then click Properties.

  5. Nella finestra Proprietà impostare la proprietà TransactionOption su Required.In the Properties window, set the TransactionOption property to Required.

  6. Nell'area di progettazione della scheda Flusso di controllo fare clic con il pulsante destro del mouse sull'attività o il contenitore che si vuole integrare nella transazione e quindi scegliere Proprietà.On the design surface of the ControlFlow tab, right-click the task or the container that you want to enroll in the transaction, and then click Properties.

  7. Nella finestra Proprietà impostare la proprietà TransactionOption su Supported.In the Properties window, set the TransactionOption property to Supported.

    Nota

    Per integrare una connessione in una transazione, integrare nella transazione le attività che la utilizzano.To enlist a connection in a transaction, enroll the tasks that use the connection in the transaction. Per altre informazioni, vedere Connessioni in Integration Services (SSIS).For more information, see Integration Services (SSIS) Connections.

  8. Ripetere i passaggi 6 e 7 per ogni attività e ogni contenitore che si desidera registrare nella transazione.Repeat steps 6 and 7 for each task and container that you want to enroll in the transaction.

Configurare un pacchetto per l'utilizzo di più transazioniConfigure a package to use multiple transactions

In questo caso, il pacchetto supporta le transazioni ma non ne avvia alcuna.In this option, the package itself supports transactions but does not start a transaction. È necessario configurare il pacchetto in modo che supporti le transazioni impostando la proprietà TransactionOption del pacchetto su Supported.You configure the package to support transactions by setting the TransactionOption property of the package to Supported.

Configurare quindi le attività e i contenitori desiderati all'interno del pacchetto in modo che inizializzino la transazione o vengano eseguiti con essa.Next, you configure the desired tasks and containers inside the package to initiate or participate in transactions. Per configurare un'attività o un contenitore in modo che inizializzi una transazione, è necessario impostare la proprietà TransactionOption dell'attività o del contenitore su Required.To configure a task or container to initiate a transaction, you set the TransactionOption property of that task or container to Required.

  1. In SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT)aprire il progetto di Integration ServicesIntegration Services contenente il pacchetto che si desidera configurare per l'utilizzo delle transazioni.In SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT), open the Integration ServicesIntegration Services project that contains the package you want to configure to use transaction.s

  2. In Esplora soluzioni fare doppio clic sul pacchetto per aprirlo.In Solution Explorer, double-click the package to open it.

  3. Fare clic sulla scheda Flusso di controllo .Click the Control Flow tab.

  4. Fare clic con il pulsante destro del mouse in un punto qualsiasi dello sfondo dell'area di progettazione del flusso di controllo e quindi scegliere Proprietà.Right-click anywhere in the background of the control flow design surface, and then click Properties.

  5. Nella finestra Proprietà impostare la proprietà TransactionOption su Supported.In the Properties window, set the TransactionOption property to Supported.

    Nota

    Il pacchetto supporta le transazioni, ma le transazioni vengono avviate da attività o contenitori nel pacchetto.The package supports transactions, but the transactions are started by task or containers in the package.

  6. Nell'area di progettazione della scheda Flusso di controllo fare clic con il pulsante destro del mouse sull'attività o il contenitore del pacchetto per il quale si vuole avviare una transazione e quindi scegliere Proprietà.On the design surface of the ControlFlow tab, right-click the task or the container in the package for which you want to start a transaction, and then click Properties.

  7. Nella finestra Proprietà impostare la proprietà TransactionOption su Required.In the Properties window, set the TransactionOption property to Required.

  8. Se la transazione viene avviata da un contenitore, fare clic con il pulsante destro del mouse sull'attività o il contenitore che si vuole includere nella transazione e quindi scegliere Proprietà.If a transaction is started by a container, right-click the task or the container that you want to enroll in the transaction, and then click Properties.

  9. Nella finestra Proprietà impostare la proprietà TransactionOption su Supported.In the Properties window, set the TransactionOption property to Supported.

    Nota

    Per integrare una connessione in una transazione, integrare nella transazione le attività che la utilizzano.To enlist a connection in a transaction, enroll the tasks that use the connection in the transaction. Per altre informazioni, vedere Connessioni in Integration Services (SSIS).For more information, see Integration Services (SSIS) Connections.

  10. Ripetere i passaggi da 6 a 9 per ogni attività e ogni contenitore che avvierà una transazione.Repeat steps 6 through 9 for each task and container that starts a transaction.

Più transazioni in un pacchettoMultiple transactions in a package

Un pacchetto di Integration ServicesIntegration Services potrebbe includere transazioni non correlate.It is possible for a package to include unrelated transactions in an Integration ServicesIntegration Services package. Quando un contenitore all'interno di una gerarchia di contenitori nidificati non supporta le transazioni, i contenitori di livello superiore o inferiore nella gerarchia avviano transazioni distinte se sono configurati per il supporto di transazioni.Any time a container in the middle of a nested container hierarchy does not support transactions, the containers above or below it in the hierarchy start separate transactions if they are configured to support transactions. Viene quindi eseguito il commit o il rollback delle transazioni a partire dall'attività più interna della gerarchia fino al livello del pacchetto.The transactions commit or roll back in order from the innermost task in the nested container hierarchy to the package. Dopo il commit della transazione più interna, tuttavia, viene eseguito il rollback solo in caso di interruzione di una transazione esterna.However, after the inner transaction commits, it does not roll back if an outer transaction is aborted.

Esempio di più transazioni in un pacchettoExample of multiple transactions in a package

Si supponga, ad esempio, che un pacchetto includa un contenitore Sequenza con due contenitori Ciclo Foreach ognuno dei quali include due attività Esegui SQL.For example, a package has a Sequence container that holds two Foreach Loop containers, and each container include two Execute SQL tasks. A differenza del contenitore Sequenza e delle attività Esegui SQL, i contenitori Ciclo Foreach non supportano transazioni.The Sequence container supports transactions, the Foreach Loop containers do not, and the Execute SQL tasks do. In questo esempio, ogni attività Esegui SQL avvia la propria transazione e non viene eseguito il rollback in caso di interruzione della transazione nell'attività Sequenza.In this example, each Execute SQL task would start its own transaction and would not roll back if the transaction on the Sequence task was aborted.

Le proprietà TransactionOption del contenitore Sequenza, del contenitore Ciclo Foreach e delle attività Esegui SQL vengono impostate nel modo seguente:The TransactionOption properties of the Sequence container, Foreach Loop container and the Execute SQL tasks are set as follows:

  • La proprietà TransactionOption del contenitore Sequenza viene impostata su Required.The TransactionOption property of the Sequence container is set to Required.

  • La proprietà TransactionOption dei contenitori Ciclo Foreach viene impostata su NotSupported.The TransactionOption properties of the Foreach Loop containers are set to NotSupported.

  • La proprietà TransactionOption dell'attività Esegui SQL viene impostata su Required.The TransactionOption properties of the Execute SQL tasks are set to Required.

    Nella figura seguente vengono illustrate le cinque transazioni non correlate del pacchetto.The following diagram shows the five unrelated transactions in the package. Una transazione viene avviata nel contenitore Sequenza e le altre quattro vengono avviate dalle attività Esegui SQL.One transaction is started by the Sequence container and four transactions are started by the Execute SQL tasks.

    Implementazione di più transazioniImplementation of multiple transactions

Transazioni ereditateInherited transactions

Un pacchetto può eseguire un altro pacchetto tramite l'attività Esegui pacchetto.A package can run another package by using the Execute Package task. Il pacchetto figlio, ovvero il pacchetto eseguito dall'attività Esegui pacchetto, può creare la propria transazione del pacchetto o ereditare quella del padre.The child package, which is the package run by the Execute Package task, may create its own package transaction, or it may inherit the parent package transaction.

Un pacchetto figlio eredita la transazione del pacchetto padre se sono soddisfatte le due condizioni seguenti:A child package inherits the parent package transaction if both of the following are true:

  • Il pacchetto viene richiamato da un'attività Esegui pacchetto.The package is invoked by an Execute Package task.

  • Anche l'attività Esegui pacchetto che richiama il pacchetto partecipa alla transazione del pacchetto padre.The Execute Package task that invoked the package also joined the parent package transaction.

    I contenitori e le attività del pacchetto figlio possono partecipare alla transazione del pacchetto padre solo se il pacchetto figlio partecipa alla transazione.Containers and tasks in the child package cannot join the parent package transaction unless the child package itself joins the transaction.

Esempio di transazioni ereditateExample of inherited transactions

Nella figura seguente sono illustrati tre pacchetti che utilizzano transazioni.In the following diagram, there are three packages that all use transactions. Ogni pacchetto include più attività.Each package contains multiple tasks. Per evidenziare il comportamento delle transazioni, sono visualizzate solo le attività Esegui pacchetto.To emphasize the behavior of the transactions, only the Execute Package tasks are shown. Il pacchetto A esegue i pacchetti B e C. Il pacchetto B esegue a sua volta i pacchetti D ed E e il pacchetto C esegue il pacchetto F.Package A runs packages B and C. In turn, package B runs packages D and E, and package C runs package F.

Ai pacchetti e alle attività sono associati gli attributi di transazione seguenti:Packages and tasks have the following transaction attributes:

  • TransactionOption è impostata su Required per i pacchetti A e CTransactionOption is set to Required on packages A and C

  • TransactionOption è impostata su Supported per i pacchetti B e D e per le attività Esegui pacchetto B, Esegui pacchetto D e Esegui pacchetto F.TransactionOption is set to Supported on packages B and D, and on the tasks Execute Package B, Execute Package D, and Execute Package F.

  • TransactionOption è impostata su NotSupported per il pacchetto E e per le attività Esegui pacchetto C e Esegui pacchetto E.TransactionOption is set to NotSupported on package E, and on the tasks Execute Package C and Execute Package E.

    Flusso di transazioni ereditateFlow of inherited transactions

    Solo i pacchetti B, D e F possono ereditare transazioni dal pacchetto padre.Only packages B, D, and F can inherit transactions from their parent packages.

    I pacchetti B e D ereditano la transazione avviata dal pacchetto A.Packages B and D inherit the transaction that was started by package A.

    Il pacchetto F eredita la transazione avviata dal pacchetto C.Package F inherits the transaction that was started by package C.

    I pacchetti A e C controllano le proprie transazioni.Packages A and C control their own transactions.

    Il pacchetto E non utilizza transazioni.Package E does not use transactions.

Risorse esterneExternal Resources

Vedere ancheSee Also

Transazioni ereditate Inherited Transactions
Più transazioniMultiple Transactions