Database.BeginTransaction vs Transactions.TransactionScope


87

Qual é a diferença entre System.Transactions.TransactionScopee EF6 Database.BeginTransaction?

Alguém poderia dar um pequeno exemplo ou apenas explicar qual usar quando houver uma diferença clara?

PS: No meu projeto, estou usando EF6. Já li a documentação, mas não ajudou muito. Também procurei os exemplos, mas eles estão usando SqlConnection.BeginTransactione agora a MS introduziu isso Database.BeginTransactionno EF6.

Respostas:


97

Eu encontrei a resposta na documentação do Entity Framework 6:

Com a introdução do EF6, a Microsoft recomenda o uso de novos métodos de API: Database.BeginTransaction()e Database.UseTransaction(). Embora System.Transactions.TransactionScopeainda seja muito bem suportado, não é mais necessário para a maioria dos usuários do EF6.

Enquanto Database.BeginTransaction()é usado apenas para transações de operações relacionadas ao banco de dados System.Transactions.TransactionScope, além disso, torna possível que o 'código C # simples' também seja transacional.

Portanto, use Database.BeginTransaction()onde quer que esteja fazendo apenas operações relacionadas ao banco de dados em uma transação em EF6, caso contrário, use System.Transactions.TransactionScopepara misturar operações de banco de dados e código C # em uma transação.

Para quem ainda prefere a TransactionScopeabordagem, é recomendável verificar suas limitações, principalmente em cenários de nuvem (os cenários de nuvem não suportam transações distribuídas).

Mais informações podem ser encontradas aqui


11
Infelizmente, você não pode aninhar transações com Database.BeginTransaction, enquanto pode com TransactionScope.
Triynko

8
O que '' código C # simples 'para ser transacional' realmente significa?
Gerard

@Gerard Presumo que isso signifique que, se você fizer operações SQL fora do EF (como usar ADO.NET), essas operações também acontecerão na mesma transação.
Rudey
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.