Apa praktik terbaik untuk melakukan transaksi di C # .Net 2.0. Kelas apa yang harus digunakan? Apa jebakan yang harus diwaspadai dll. Semua hal-hal yang komit dan kembalikan. Saya baru memulai proyek di mana saya mungkin perlu melakukan beberapa transaksi saat memasukkan data ke dalam DB. Setiap tanggapan atau tautan untuk hal-hal mendasar tentang transaksi disambut.
c#
.net
transactions
Malik Daud Ahmad Khokhar
sumber
sumber
Jawaban:
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):
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:
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:
sumber
sumber
Anda juga bisa membungkus transaksi menjadi prosedur tersimpan sendiri dan menanganinya seperti itu daripada melakukan transaksi di C # itu sendiri.
sumber
jika Anda hanya memerlukannya untuk hal-hal yang berkaitan dengan db, beberapa ATAU Pemetaan (mis. NHibernate) mendukung transactinos di luar kotak per default.
sumber
Itu juga tergantung pada apa yang Anda butuhkan. Untuk transaksi SQL dasar, Anda dapat mencoba melakukan transaksi TSQL dengan menggunakan BEGIN TRANS dan COMMIT TRANS dalam kode Anda. Itu adalah cara termudah tetapi memang memiliki kompleksitas dan Anda harus berhati-hati untuk melakukan dengan benar (dan kembalikan).
Saya akan menggunakan sesuatu seperti
Kegagalan akan membuat Anda keluar dari
using
dan transaksi akan selalu komit atau kembalikan (tergantung pada apa yang Anda suruh lakukan). Masalah terbesar yang kami hadapi adalah memastikan itu selalu dilakukan. Penggunaan memastikan lingkup transaksi terbatas.sumber