Database.BeginTransaction vs Transactions.TransactionScope

90

Apa perbedaan antara System.Transactions.TransactionScopedan EF6 Database.BeginTransaction?

Bisakah seseorang memberikan contoh kecil atau hanya menjelaskan mana yang akan digunakan bila dengan perbedaan yang jelas?

PS: Dalam proyek saya, saya menggunakan EF6. Saya sudah membaca dokumentasinya tetapi tidak banyak membantu. Juga melihat contoh tetapi mereka lebih suka menggunakan SqlConnection.BeginTransactiondan sekarang MS telah memperkenalkan yang baru ini Database.BeginTransactiondi EF6.

Bakat
sumber

Jawaban:

98

Saya menemukan jawabannya dalam dokumentasi Entity Framework 6:

Dengan diperkenalkannya EF6, Microsoft merekomendasikan untuk menggunakan metode API baru: Database.BeginTransaction()dan Database.UseTransaction(). Meskipun System.Transactions.TransactionScopemasih didukung dengan sangat baik, ini tidak lagi diperlukan untuk sebagian besar pengguna EF6.

Sementara Database.BeginTransaction()hanya digunakan untuk transaksi operasi terkait database System.Transactions.TransactionScope, selain itu, memungkinkan 'kode C # biasa' juga menjadi transaksional.

Oleh karena itu, gunakan di Database.BeginTransaction()mana pun hanya melakukan operasi terkait db dalam transaksi di EF6 jika tidak, gunakanSystem.Transactions.TransactionScope untuk mencampur operasi db dan kode C # bersama-sama dalam transaksi.

Bagi mereka yang masih lebih suka TransactionScopependekatan ini, disarankan agar mereka mengatasi batasannya, terutama dalam skenario cloud (skenario cloud tidak mendukung transaksi terdistribusi).

Informasi lebih lanjut dapat ditemukan di sini

Bakat
sumber
11
Sayangnya, Anda tidak dapat menumpuk transaksi dengan Database.BeginTransaction, sedangkan Anda bisa dengan TransactionScope.
Triynko
8
Apa sebenarnya arti '' kode C # biasa 'menjadi transaksional'?
Gerard
@Gerard Saya berasumsi itu berarti bahwa jika Anda melakukan operasi SQL di luar EF (seperti menggunakan ADO.NET), operasi tersebut juga akan terjadi di bawah transaksi yang sama.
Rudey