Bagikan melalui


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 adalah true, dan sesi masuk dimatikan dengan lancar dan bukan ditutup karena kesalahan jaringan atau klien, transaksi yang tidak selesai berhasil diselesaikan. Atau, jika properti ini adalah false atau jika sesi tidak ditutup dengan lancar, setiap transaksi yang tidak selesai digulung balik saat sesi ditutup. Jika properti ini adalah true, 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 adalah true, 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 dan transactionTimeout 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 adalah false, transaksi akan dilampirkan ke instans, dan hanya ditandai sebagai "selesai" jika klien memanggil metode berikutnya yang ditandai dengan properti ini yang sama dengan true, 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 ke true. Jika properti ini diatur ke true, Anda harus menggunakan saluran dengan sesi, dan InstanceContextMode harus diatur ke PerSession.