Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET Framework
.NET
.NET Standard
As transações em ADO.NET são usadas quando se quer ligar várias tarefas para que sejam executadas como uma única unidade de trabalho. Por exemplo, imagine que uma aplicação realiza duas tarefas. Primeiro, atualiza uma tabela com informações de encomenda. Em segundo lugar, atualiza uma tabela que contém informações de inventário, debitando os itens encomendados. Se alguma das tarefas falhar, ambas as atualizações são revertidas.
Determinação do tipo de transação
Uma transação é considerada local quando é uma transação de fase única e é tratada diretamente pela base de dados. Uma transação é considerada uma transação distribuída quando é coordenada por um monitor de transações e utiliza mecanismos de segurança (como o commit em duas fases) para resolução de transações.
O Microsoft SqlClient Data Provider para SQL Server tem o seu próprio SqlTransaction objeto para realizar transações locais em bases de dados SQL Server. Outros fornecedores de dados .NET também fornecem os seus próprios Transaction objetos. Além disso, existe uma DbTransaction classe disponível para escrever código independente do fornecedor que requer transações.
Observação
As transações são mais eficientes quando são realizadas no servidor. Se estiver a trabalhar com uma base de dados SQL Server que faz uso extensivo de transações explícitas, considere escrevê-las como procedimentos armazenados usando a instrução Transact-SQL BEGIN TRANSACTION.
Realizar uma transação usando uma única ligação
No ADO.NET, controlas as transações com o Connection objeto. Pode iniciar uma transação local com o BeginTransaction método. Depois de iniciar uma transação, pode inscrever um comando nessa transação com a propriedade Transaction de um objeto Command. Pode então validar ou reverter as modificações feitas na fonte de dados de acordo com o sucesso ou fracasso dos componentes da transação.
Observação
O EnlistDistributedTransaction método não deve ser usado para uma transação local.
O âmbito da transação limita-se à ligação. O exemplo seguinte executa uma transação explícita que consiste em dois comandos separados no try bloco. Os comandos executam instruções INSERT contra a tabela Production.ScrapReason na base de dados de exemplo AdventureWorks do SQL Server, que são confirmadas caso não ocorram exceções. O código no catch bloco reverte a transação se for lançada uma exceção. Se a transação for abortada ou a ligação for encerrada antes de a transação ser concluída, é automaticamente revertida.
Example
Siga estes passos para realizar uma transação.
Chame o BeginTransaction método do SqlConnection objeto para marcar o início da transação. O BeginTransaction método devolve uma referência à transação. Esta referência é atribuída aos SqlCommand objetos que são listados na transação.
Atribuir o objeto
Transactionà propriedade Transaction da SqlCommand a ser executada. Se um comando for executado numa ligação com uma transação ativa, e oTransactionobjeto não tiver sido atribuído àTransactionpropriedade doCommandobjeto, é lançada uma exceção.Executa os comandos necessários.
Chame o Commit método do SqlTransaction objeto para completar a transação, ou chame o Rollback método para terminar a transação. Se a ligação for fechada ou descartada antes de qualquer um dos métodos Commit ou Rollback ter sido executado, a transação é revertida.
O exemplo de código seguinte demonstra lógica transacional usando o Microsoft SqlClient Data Provider for SQL Server.
using System;
using Microsoft.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Data Source = localhost; Integrated Security = true; Initial Catalog = AdventureWorks";
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);
}
}
}
}
}