Dasturiy transaksiyalarni boshqarish odatda ajoyib fikr bo'lishi mumkin, faqatgina sizda kam sonli transaksiyal operatsiyalar mavjud bo'lsa. Masalan, agar sizda faqat ma'lum yangilash operatsiyalari uchun transaksiyalar talab qiladigan veb-ilova bo'lsa, Spring yoki boshqa biror texnologiya bilan transaksiyon proksilarni sozlash shart emas. Bunday holatda TransactionTemplate dan foydalanish yaxshi g'oya bo'lishi mumkin. Transaksiya nomini aniq belgilash imkoniyati faqat dasturiy yondashuvda mavjud.
Aksincha, agar ilova ko'plab transaksion operatsiyalarga ega bo'lsa, deklarativ transaksiyalarni boshqarish odatda o'rinli bo'ladi. Bu biznes logikasida transaksiyalarni boshqarishni o'z ichiga olmaydi va oson konfiguratsiya qilinadi. Spring Framework dan foydalanganda, EJB dan masalan CMT dan emas, deklarativ transaksiyalarni boshqarish xarajatlari sezilarli darajada kamayadi.
Transaksiya chegaralaridagi hodisalar
Spring 4.2 versiyasidan boshlab, voqeaning tinglovchisi transaksiya fazasiga bog'lanishi mumkin. Eng keng tarqalgan misol - transaksiyaning muvaffaqiyatli yakunlanishidagi voqeani qayta ishlash. Bu, agar joriy transaksiyaning natijasi tinglovchi uchun juda muhim bo'lsa, voqealarni yanada moslashuvchan ishlatishga imkon beradi.
Oddiy voqea tinglovchisini @EventListener annotatsiyasi yordamida ro'yxatdan o'tkazishingiz mumkin. Agar uni transaksiyaga bog'lash kerak bo'lsa, @TransactionalEventListener annotatsiyasidan foydalaning. Shundan so'ng tinglovchi odatda transaksiyaning tasdiqlanish fazasiga bog'lanadi.
Keyingi misol ushbu tushunchani namoyish etadi. Tarkibiy qism ma'lum bir tartibda yaratilgan hodisani e'lon qilishini faraz qiling va biz bu hodisani faqat e'lon qilingan transaksiyaning muvaffaqiyatli tasdiqlanishidan keyin qayta ishlashi kerak bo'lgan tinglovchini aniqlashimiz kerak. Quyidagi misol bunday voqea tinglovchisini o'rnatadi:
@Component
public class MyComponent {
@TransactionalEventListener
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
// ...
}
}
@Component
class MyComponent {
@TransactionalEventListener
fun handleOrderCreatedEvent(creationEvent: CreationEvent<Order>) {
// ...
}
}
@TransactionalEventListener annotatsiyasi phase atributini ochib beradi, bu tinglovchi bog'lanishi kerak bo'lgan transaksiya fazasini sozlash imkonini beradi. Amalga oshadigan fazalar BEFORE_COMMIT, AFTER_COMMIT (standart bo'lib), AFTER_ROLLBACK va AFTER_COMPLETION bo'lib, tranzaksiyaning yakunlanishini (tasdiqlash yoki rad qilish bo'lishidan qat'i nazar) birlashtiradi.
Agar transaksiya amalga oshirilmasa, tinglovchi umuman chaqirilmaydi, chunki biz zarur semantikani ta'minlay olmaymiz. Shuning uchun bu ish tartibini o'zgartirish mumkin, agar annotatsiyaning fallbackExecution atributini true ga o'rnatib qo'ysangiz.
@TransactionalEventListener annotatsiyasi faqat PlatformTransactionManager bilan boshqariladigan oqimli transaksiyalar bilan ishlaydi. ReactiveTransactionManager tomonidan boshqariladigan reaktiv transaksiyalar, o'zining lokal oqim atributlaridan ko'ra, Reactor kontekstidan foydalanadi, shuning uchun tinglovchi nazarida birgalikda qatnashishi mumkin bo'lgan faol transaksiyalar mavjud emas.
Dastur serveri bilan integratsiya
Spring transaksiyalarining abstraktsiyasi, umuman, dastur serveridan mustaqildir. Bundan tashqari, Spring ichidagi JtaTransactionManager (bu JTA dan UserTransaction va TransactionManager ob'ektlarini JNDI orqali izlashni ixtiyoriy ravishda amalga oshirishi mumkin) oxirgi ob'ektni joylashishini avtomatik tarzda aniqlaydi, bu dastur serveriga bog'liq. JTA dan TransactionManager ga kirish imkoniyati transaksiyalar semantikasini kengaytirishga imkon beradi - xususan, tranzaktsiyalarni to'xtatishni qo'llab-quvvatlash. Batafsil ma'lumot uchun JtaTransactionManager javadocini ko'ring.
Spring'dan JtaTransactionManager Java EE dastur serverlarida bajarishning tipik usuli bo'lib, odatda barcha keng tarqalgan serverlarda ishlaydi. Kengaytirilgan funksionallik, masalan, tranzaktsiyalarni to'xtatish, ko'plab serverlarda (GlassFish, JBoss va Geronimo kabi) hech qanday maxsus konfiguratsiyani talab qilmasdan ishlaydi. Ammo to'liq to'xtatishni qo'llab-quvvatlash va yanada kengroq integratsiyani amalga oshirish uchun Spring WebLogic Server va WebSphere uchun maxsus adapterlarni o'z ichiga oladi. Bu adapterlar keyingi bo'limlarda tasvirlangan.
Standart senariylar uchun, WebLogic Server va WebSphere ni o'z ichiga olgan holda, <tx:jta-transaction-manager/> konfiguratsiya elementidan foydalaning. Konfiguratsiya qilinganida, bu element asosiy serverni avtomatik ravishda aniqlaydi va platforma uchun mavjud bo'lgan eng yaxshi transaktsiyalar boshqaruvchisini tanlaydi. Bu serverga xos adapter sinflarini aniq konfiguratsiya qilishni talab qilmaydi (keyingi bo'limlarda ta'kidlanganidek), ular avtomatik ravishda tanlanadi, bunda standart JtaTransactionManager standart sifatida tanlanadi.
IBM'dan WebSphere
WebSphere 6.1.0.9 va undan yuqori versiyalarida Spring'da tavsiya etilgan JTA transaktsiyalar boshqaruvchisi WebSphereUowTransactionManager dir. Ushbu maxsus adapter IBM API UOWManager'ni ishlatadi, u WebSphere Application Server 6.1.0.9 va undan keyingi versiyalarida mavjud. Ushbu adapter orqali Spring tomonidan boshqariladigan transaktsiyalarni to'xtatish (to'xtatish va PROPAGATION_REQUIRES_NEW bilan qayta tiklash) IBM tomonidan rasmiy ravishda qo'llab-quvvatlanadi.
Oracle'dan WebLogic Server
WebLogic Server 9.0 yoki undan yuqori versiyalarda odatda WebLogicJtaTransactionManager dan foydalaniladi, standart JtaTransactionManager sinfi o'rniga. Ushbu maxsus WebLogic uchun xos bo'lgan JtaTransactionManager ning oddiy sinfi Spring transaksiyalarini WebLogic tomonidan boshqariladigan transaktsiyalar muhitida, JTA ning standart semantikasi bilan bir qatorda, to'liq funksionallikda qo'llab-quvvatlaydi. Funktsiyalar tranzaktsiya nomlari, har bir tranzaksiya uchun izolyatsiya darajalari va har qanday holatda transaktsiyalarni to'g'ri qayta tiklashni o'z ichiga oladi.
Tez-tez uchraydigan muammolarni hal qilish
Ushbu bo'limda ba'zi keng tarqalgan muammolarni hal qilish uchun yechimlar taqdim etilgan.
Muayyan DataSource uchun noto'g'ri transaktsiyalar boshqaruvchisini ishlatish
Foydalanmoqchi bo'lgan transaksion texnologiyalaringiz va talablaringiz asosida to'g'ri PlatformTransactionManager ni tanlang. Agar to'g'ri ishlatilsa, Spring Framework eng oddiy va portativ abstraktsiyani taqdim etadi. Agar global transaksiyalar ishlatilsa, barcha transaksion operatsiyalar uchun org.springframework.transaction.jta.Jta.JtaTransactionManager (yoki dastur serveriga xos sinf) dan foydalaning. Aks holda, transaksiyalar infratuzilmasi mahalliy transaksiyalarni bunday resurslarda, masalan, konteynerlangan DataSource namunalari ustida amalga oshirishga harakat qiladi. Bunday mahalliy transaksiyalar mantiqsizdir va yaxshi ishlaydigan dastur serveri ularni xatolik deb hisoblaydi.
Qo'shimcha manbalar
Spring Framework'da transaksiyalarni qo'llab-quvvatlash haqida qo'shimcha ma'lumot uchun:
-
Spring'da taqsimlangan transaktsiyalar, XA bilan va XA siz - JavaWorld'dagi taqdimot, unda Deyvid Sayer Spring'dan sizni Spring ilovalari uchun taqsimlangan transaktsiyalarning etti sxemasi bilan tanishtiradi, ulardan uchtasi XA bilan va to'rttasi XA siz.
-
Java transaktsiyalari dizayn strategiyalari - InfoQ da mavjud bo'lgan kitob, u Java transaktsiyalari haqida yaxshi asoslangan kirishni taqdim etadi. Unda Spring Framework va EJB3 da transaktsiyalarni sozlash va ishlatish uchun parallel misollar keltirilgan.
GO TO FULL VERSION