WCF - Transaksi
Transaksi di WCF adalah sekumpulan operasi yang mengikuti beberapa properti, yang secara kolektif dikenal sebagai ACID. Di sini, jika satu operasi gagal, seluruh sistem gagal secara otomatis. Ketika pesanan dilakukan secara online, transaksi terjadi. Contoh berikut dapat membantu untuk memahami proses transaksi dalam istilah yang lebih sederhana.
Contoh
Misalkan Anda telah memesan televisi LCD dari toko online dan Anda akan membayar jumlahnya dengan kartu kredit Anda. Saat Anda memasukkan informasi yang diperlukan untuk melakukan pemesanan, dua operasi terjadi secara bersamaan.
Pertama, jumlah tertentu akan didebet dari rekening bank Anda dan kedua, akun vendor dikreditkan dengan jumlah yang sama. Kedua operasi harus berhasil dijalankan agar transaksi berhasil.
Properti Transaksi WCF
Empat properti yang diikuti dengan transaksi WCF adalah sebagai berikut -
Atomic - Semua operasi harus bertindak sebagai operasi tunggal yang tidak dapat dipisahkan pada penyelesaian transaksi.
Consistency - Apa pun set operasinya, sistem selalu dalam keadaan konsisten, misalnya, hasil transaksi selalu sesuai harapan.
Isolation - Status perantara sistem tidak terlihat oleh entitas mana pun di dunia luar hingga transaksi selesai.
Durability - Status komitmen dipertahankan terlepas dari segala jenis kegagalan (perangkat keras, pemadaman listrik, dll.)
Saat mengonfigurasi transaksi WCF, ada beberapa faktor yang perlu dipertimbangkan. Ini adalah perilaku mengikat dan operasi.
Binding- Binding yang mendukung transaksi di WCF hanya sedikit dan sangat penting untuk membuat pilihan dari binding ini saja, yang tetap dinonaktifkan secara default dan harus diaktifkan untuk mendapatkan dukungan yang diperlukan untuk transaksi. Binding ini adalah sebagai berikut -
- NetTcpBinding
- NetNamedPipeBinding
- WSHttpBinding
- WSDualHttpBinding
- WSFederationHttpBinding
Operation behavior- Sementara pengikatan memfasilitasi jalur untuk penyebaran transaksi, sebuah operasi menangani pemrosesan transaksi serta konfigurasi operasi. Perilaku operasi terutama menggunakan dua atribut: TransactionFlow dan TransactionScopeRequired. Di sini, perlu dicatat bahwa TransactionFlow memiliki tiga nilai utama dan ini adalah: Allowed, Mandatory, dan NotAllowed.
Kode berikut menunjukkan apakah mengubah konfigurasi mengikat dan kontrak operasi memfasilitasi penyebaran klien atau tidak.
<bindings>
<wsHttpBinding>
<binding name = "MandatoryTransBinding" transactionFlow = "true">
<reliableSession enabled ="true"/>
</binding>
</wsHttpBinding>
</bindings>
Protokol Transaksi
WCF menggunakan tiga jenis protokol untuk transaksi -
- Lightweight
- Transaksi Ole
- Transaksi WS-Atom (WS-AT)
Dari ketiganya, WS-AT adalah protokol yang dapat dioperasikan dan memungkinkan aliran transaksi terdistribusi di seluruh firewall. Namun, protokol ini tidak boleh digunakan jika transaksi hanya didasarkan pada teknologi Microsoft.
Tahapan Transaksi WCF
Ada dua tahapan dalam transaksi WCF seperti yang ditunjukkan pada gambar berikut.
Prepare Phase - Dalam fase ini, manajer transaksi memeriksa apakah semua entitas siap untuk melakukan transaksi atau tidak.
Commit Phase - Dalam fase ini, komitmen entitas dimulai dalam kenyataan.
Gambar berikut mengilustrasikan fungsi dari kedua fase transaksi WCF.
Mengaktifkan Transaksi WCF
Untuk mengaktifkan transaksi WCF dengan sukses, seseorang perlu mengikuti serangkaian enam langkah secara berurutan. Langkah-langkah yang diperlukan dibahas di bawah ini.
Step 1 − Creation of two WCF Services
Langkah terpenting dalam hal ini adalah membangun dua proyek layanan di WCF untuk berpartisipasi dalam satu transaksi. Transaksi database akan dilakukan pada kedua layanan ini dan akan dipahami bahwa bagaimana mereka disatukan oleh transaksi WCF. Aplikasi web transaksi WCFT juga telah dibuat untuk menggunakan dua layanan yang dibuat dalam satu cakupan transaksi.
Step 2 − Method creation and its attribution with TransactionFlow attribute
Di sini, metode UpdateData akan dibuat untuk kedua layanan WCF untuk dimasukkan ke dalam database dengan atribut OperationContract. Untuk menyelesaikan tugas ini, kelas antarmuka pertama kali dibuat dengan bantuan atribut ServiceContract. Untuk mengaktifkan transaksi dalam metode yang baru dibuat, ini dikaitkan dengan TransactionFlow dan transaksi diizinkan menggunakan nilai Diizinkan.
[ServiceContract]
public interface IService1 {
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
Step 3− Implementation of WCF service with TransactionScopeRequired attribute
Ini dilakukan dengan menggunakan kode yang ditunjukkan di bawah ini -
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
try {
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
Boolean doRollback = false;
using(SqlCommand cmd = new SqlCommand(
"insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
try {
cmd.ExecuteNonQuery();
} catch(SqlException) {
doRollback = true;
break;
}
}
if(doRollback)
transaction.Rollback();
else
transaction.Commit();
}
finally {
objConection.Close();
}
}
Step 4 − Enabling Transaction Flow by WCF Service Config File
Pengkodeannya dilakukan sebagai berikut -
<bindings>
<wsHttpBinding>
<binding name = "TransactionalBind" transactionFlow = "true"/>
</wsHttpBinding>
</bindings>
Sangat penting untuk melampirkan transaksi yang diperbolehkan mengikat dengan titik akhir untuk mengekspos layanan WCF.
<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">
Step 5 − Calling both the services in a single transaction
Di sini, dua layanan di atas dipanggil dalam satu transaksi dan untuk tujuan ini, objek TransactionScope digunakan untuk mengelompokkan kedua layanan. Metode Lengkap dari objek di atas dipanggil untuk melakukan transaksi WCF. Untuk mengembalikan, metode Buang akan dipanggil.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
// Call your webservice transactions here
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Sepotong kecil dari kode lengkap di mana transaksi WCF telah dikelompokkan dalam satu ruang lingkup digambarkan di bawah ini -
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Step 6 − Testing WCF transaction
Pengujian dilakukan pada langkah ke-6 dan terakhir dan setelah memanggil layanan WCF pertama, pengecualian diberlakukan.