Ada 2 jenis transaksi utama; transaksi koneksi dan transaksi sekitar. Transaksi koneksi (seperti SqlTransaction) terkait langsung dengan koneksi db (seperti SqlConnection), yang berarti Anda harus terus melewati koneksi - OK dalam beberapa kasus, tetapi tidak mengizinkan "buat / gunakan / lepaskan" penggunaan, dan tidak memungkinkan kerja lintas-db. Contoh (diformat untuk spasi):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Tidak terlalu berantakan, tetapi terbatas pada koneksi kami "samb". Jika kita ingin memanggil metode yang berbeda, kita sekarang perlu memberikan "koneksi".
Alternatifnya adalah transaksi ambient; baru di .NET 2.0, objek TransactionScope (System.Transactions.dll) memungkinkan penggunaan pada berbagai operasi (penyedia yang sesuai akan secara otomatis mendaftar dalam transaksi ambient). Ini memudahkan retro-fit ke dalam kode (non-transaksional) yang ada, dan berbicara dengan banyak penyedia (meskipun DTC akan terlibat jika Anda berbicara dengan lebih dari satu).
Sebagai contoh:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Perhatikan di sini bahwa kedua metode dapat menangani koneksi mereka sendiri (buka / gunakan / tutup / buang), namun mereka akan diam-diam menjadi bagian dari transaksi ambient tanpa kita harus memasukkan apa pun.
Jika kode Anda salah, Buang () akan dipanggil tanpa Lengkap (), sehingga akan dibatalkan. Sarang yang diharapkan dll didukung, meskipun Anda tidak dapat memutar kembali transaksi dalam belum menyelesaikan transaksi luar: jika ada yang tidak senang, transaksi dibatalkan.
Keuntungan lain dari TransactionScope adalah ia tidak hanya terikat pada basis data; semua penyedia yang mengetahui transaksi dapat menggunakannya. WCF, misalnya. Atau bahkan ada beberapa model objek yang kompatibel dengan TransactionScope (mis. Kelas .NET dengan kemampuan rollback - mungkin lebih mudah daripada kenang-kenangan, meskipun saya belum pernah menggunakan pendekatan ini sendiri).
Semua dalam semua, objek yang sangat, sangat bermanfaat.
Beberapa peringatan:
- Pada SQL Server 2000, TransactionScope akan langsung menuju DTC; ini diperbaiki dalam SQL Server 2005 dan di atas, dapat menggunakan LTM (apalagi overhead) sampai Anda berbicara dengan 2 sumber dll, ketika dinaikkan ke DTC.
- Ada kesalahan yang berarti Anda mungkin perlu mengubah string koneksi Anda