Existem 2 tipos principais de transações; transações de conexão e transações ambientais. Uma transação de conexão (como SqlTransaction) está vinculada diretamente à conexão db (como SqlConnection), o que significa que você deve continuar transmitindo a conexão - OK em alguns casos, mas não permite "criar / usar / liberar" uso e não permite trabalho entre db. Um exemplo (formatado para espaço):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Não é muito confuso, mas limitado à nossa conexão "conn". Se queremos chamar métodos diferentes, agora precisamos passar o "conn".
A alternativa é uma transação ambiental; novo no .NET 2.0, o objeto TransactionScope (System.Transactions.dll) permite o uso em várias operações (provedores adequados se inscreverão automaticamente na transação do ambiente). Isso facilita a adaptação retroativa ao código existente (não transacional) e a conversa com vários fornecedores (embora o DTC se envolva se você falar com mais de um).
Por exemplo:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Observe aqui que os dois métodos podem lidar com suas próprias conexões (abrir / usar / fechar / descartar), mas silenciosamente se tornarão parte da transação do ambiente sem que tenhamos que passar nada.
Se os erros do seu código, Dispose () serão chamados sem Complete (), serão revertidos. O aninhamento esperado etc é suportado, embora você não possa reverter uma transação interna e ainda concluir a transação externa: se alguém estiver infeliz, a transação será abortada.
A outra vantagem do TransactionScope é que ele não está vinculado apenas aos bancos de dados; qualquer provedor que reconhece transações pode usá-lo. WCF, por exemplo. Ou ainda existem alguns modelos de objetos compatíveis com TransactionScope (por exemplo, classes .NET com capacidade de reversão - talvez mais fáceis do que uma lembrança, embora eu nunca tenha usado essa abordagem).
Em suma, um objeto muito, muito útil.
Algumas advertências:
- No SQL Server 2000, um TransactionScope irá para o DTC imediatamente; isso é corrigido no SQL Server 2005 e acima, ele pode usar o LTM (muito menos sobrecarga) até você falar com 2 fontes, etc., quando for elevado ao DTC.
- Há uma falha que significa que você pode precisar ajustar sua cadeia de conexão