Atribut Transaksi ServiceModel
Windows Communication Foundation (WCF) menyediakan properti pada tiga atribut System.ServiceModel standar yang memungkinkan Anda mengonfigurasi perilaku transaksi untuk layanan WCF:
TransactionFlowAttribute
Atribut TransactionFlowAttribute menentukan kesediaan operasi dalam kontrak layanan untuk menerima transaksi masuk dari klien. Atribut tersebut menyediakan kontrol ini dengan properti berikut: Transaksi menggunakan enumerasi TransactionFlowOption untuk menentukan apakah transaksi yang masuk adalah Mandatory, Allowed, atau NotAllowed.
Ini adalah satu-satunya atribut yang menghubungkan operasi layanan dengan interaksi eksternal ke klien. Atribut yang dijelaskan dalam bagian berikut berkaitan dengan penggunaan transaksi dalam pelaksanaan operasi.
ServiceBehaviorAttribute
Atribut ServiceBehaviorAttribute menentukan perilaku eksekusi internal implementasi kontrak layanan. Properti khusus transaksi dari atribut ini meliputi:
TransactionAutoCompleteOnSessionClose menentukan apakah akan menyelesaikan transaksi yang belum selesai saat sesi ditutup. Nilai default untuk properti ini adalah
false
. Jika properti ini adalahtrue
, dan sesi masuk dimatikan dengan lancar dan bukan ditutup karena kesalahan jaringan atau klien, transaksi yang tidak selesai berhasil diselesaikan. Atau, jika properti ini adalahfalse
atau jika sesi tidak ditutup dengan lancar, setiap transaksi yang tidak selesai digulung balik saat sesi ditutup. Jika properti ini adalahtrue
, saluran masuk harus berbasis sesi.ReleaseServiceInstanceOnTransactionComplete menentukan apakah instans layanan yang mendasar dirilis saat transaksi selesai. Nilai default untuk properti ini adalah
true
. Pesan masuk berikutnya menyebabkan instans baru yang mendasarinya dibuat, membuang status per transaksi apa pun yang mungkin dimiliki instans sebelumnya. Merilis instans layanan adalah tindakan internal yang diambil layanan dan tidak berdampak pada koneksi atau sesi yang ada yang mungkin telah ditetapkan klien. Fungsi ini setara dengan fitur aktivasi just-in-time yang disediakan COM+. Jika properti adalahtrue
, ConcurrencyMode harus sama dengan Single. Jika tidak, layanan ini akan memunculkan pengecualian validasi konfigurasi tidak valid selama pengaktifan.TransactionIsolationLevel menentukan tingkat isolasi yang akan digunakan untuk transaksi dalam layanan; properti ini mengambil salah satu nilai IsolationLevel. Jika properti tingkat isolasi lokal adalah apa pun selain Unspecified, tingkat isolasi transaksi masuk harus cocok dengan pengaturan properti lokal ini. Jika tidak, transaksi yang masuk akan ditolak, dan kesalahan dikirimkan kembali ke klien. Jika TransactionScopeRequired adalah
true
, dan tidak ada transaksi yang mengalir, properti ini menentukan nilai IsolationLevel yang akan digunakan untuk transaksi yang dibuat secara lokal. Jika IsolationLevel diatur ke Unspecified, IsolationLevelSerializable akan digunakan.TransactionTimeout menentukan periode waktu di mana transaksi baru yang dibuat di layanan harus diselesaikan. Jika waktu ini tercapai dan transaksi belum selesai, maka transaksi akan dibatalkan. TimeSpan digunakan sebagai waktu habis TransactionScope untuk operasi apa pun yang mengatur TransactionScopeRequired ke
true
, di mana transaksi baru dibuat. Waktu habis adalah durasi maksimum yang diizinkan dari pembuatan transaksi hingga penyelesaian fase 1 dalam protokol penerapan dua fase. Nilai waktu habis yang digunakan selalu merupakan nilai yang lebih rendah antara properti TransactionTimeout dantransactionTimeout
pengaturan konfigurasi.
OperationBehaviorAttribute
Atribut OperationBehaviorAttribute menentukan perilaku metode dalam implementasi layanan. Anda dapat menggunakannya untuk menunjukkan perilaku eksekusi spesifik operasi. Properti atribut ini tidak memengaruhi deskripsi Bahasa Deskripsi Layanan Web (WSDL) dari kontrak layanan, dan murni elemen dari model pemrograman WCF yang memungkinkan fitur umum yang harus diimplementasikan oleh pengembang sendiri.
Atribut ini memiliki properti khusus transaksi berikut:
TransactionScopeRequired menentukan apakah metode harus dijalankan dalam cakupan transaksi aktif. Default adalah
false
. Jika atribut OperationBehaviorAttribute tidak ditetapkan untuk metode, hal ini menyiratkan bahwa metode tidak akan dijalankan dalam transaksi. Jika cakupan transaksi tidak diperlukan untuk operasi, transaksi apa pun yang ada di dalam header pesan tidak diaktifkan dan tetap menjadi elemen IncomingMessageProperties dari OperationContext. Jika cakupan transaksi diperlukan untuk operasi, sumber transaksi berasal dari salah satu hal berikut:Jika transaksi dialirkan dari klien, metode akan dijalankan di bawah cakupan transaksi yang dibuat menggunakan transaksi terdistribusi tersebut.
Dengan transportasi antrean, transaksi yang digunakan untuk menghapus antrean pesan akan digunakan. Perhatikan bahwa transaksi yang digunakan bukan transaksi yang mengalir, karena tidak disediakan oleh pengirim asli pesan.
Transportasi kustom dapat menyediakan transaksi melalui penggunaan
TransportTransactionProperty
.Jika tidak ada dari hal di atas yang menyediakan sumber eksternal untuk transaksi, instans Transaction baru akan segera dibuat sebelum memanggil metode.
TransactionAutoComplete menentukan apakah transaksi di mana metode dijalankan selesai secara otomatis jika tidak ada pengecualian yang tidak ditangani yang dilemparkan. Jika properti ini adalah
true
, infrastruktur panggilan secara otomatis akan menandai transaksi sebagai "selesai" jika metode pengguna dikembalikan tanpa melemparkan pengecualian. Jika properti ini adalahfalse
, transaksi akan dilampirkan ke instans, dan hanya ditandai sebagai "selesai" jika klien memanggil metode berikutnya yang ditandai dengan properti ini yang sama dengantrue
, atau jika metode berikutnya secara eksplisit memanggil SetTransactionComplete. Kegagalan untuk melakukan salah satu dari ini akan menyebabkan transaksi tidak pernah "selesai", dan pekerjaan yang terkandung tidak dilakukan, kecuali properti TransactionAutoCompleteOnSessionClose diatur ketrue
. Jika properti ini diatur ketrue
, Anda harus menggunakan saluran dengan sesi, dan InstanceContextMode harus diatur ke PerSession.