Hibernate-reactive: Peningkatan - Integrasi dengan pegas @Anotasi transaksi

Dibuat pada 20 Mei 2021  ·  16Komentar  ·  Sumber: hibernate/hibernate-reactive

Hai,

kami sedang dalam evaluasi berkelanjutan dari hibernate reaktif untuk menggantikan perangkat lunak perangkat lunak kami saat ini yang terdiri dari postgres-db+spring boot+spring data+r2dbc. Kami menghadapi banyak keterbatasan dalam menggunakan r2dbc dan kami ingin menggunakan kembali pengetahuan besar yang telah kami miliki tentang Hibernate.
Kami hampir memfaktorkan ulang layanan mikro lengkap, menulis ulang data pegas kami sendiri (repositori umum) dan itu terlihat sangat bagus.

Salah satu pengembang masalah utama meningkatkan opsi untuk menggunakan manajemen transaksi deklaratif (menggunakan anotasi) alih-alih terprogram.

Kita tahu bahwa bukan tujuan dari Hibernate reaktif untuk mengimplementasikan mekanisme tersebut, tetapi untuk kerangka kerja (Spring, Quarkus...) yang terintegrasi dengan Hibernate, seperti yang dilakukan untuk Hibernate standar. Bahkan jika kita ingin melakukannya sendiri, API transaksi di Hibernate reaktif tidak sama dengan API Hibernate standar dan tidak ada API untuk berinteraksi dengan pengelola transaksi.

Saya akan senang jika kami bisa mendapatkan komentar Anda tentang ini (dan terlebih lagi jika Anda bisa :smiley :), dan jika Anda masih berpikir kami bisa melakukannya untuk mengusulkan pedoman umum karena saat ini kami tidak tahu bagaimana melakukannya.
Terima kasih

problem

Semua 16 komentar

Yah saya kira Spring memiliki semacam konsep pencegat di mana Anda bisa menggunakan anotasi untuk mengikat pencegat ke panggilan metode kacang. Jika Anda memanggil withTransaction() dari dalam pencegat seperti itu, dan kemudian mendelegasikan ke metode kacang, itu saja manajemen transaksi deklaratif. Benar-benar seharusnya hanya beberapa baris kode. (Setidaknya itu akan ada di CDI, saya kurang yakin tentang musim semi.)

Satu-satunya kehalusan adalah bahwa Anda memerlukan cara untuk mendeteksi jika ada transaksi yang sudah terikat ke aliran reaktif saat ini. Di tumpukan kami itu akan dilakukan menggunakan MP Contexts. Tidak tahu bagaimana itu dilakukan di tanah musim semi.

(OTOH jika Anda bertanya tentang bagaimana mengintegrasikan dengan dengan manajer transaksi XA, yah, itu adalah kaleng worm yang sangat berbeda, dan tidak terlalu praktis dengan driver reaktif saat ini. Kami belum memiliki transaksi yang benar-benar reaktif manajer.)

Saat ini, kami tidak membutuhkan transaksi terdistribusi

Kemudian pencegat yang memanggil SessionFactory.withTransaction() akan berfungsi dengan baik.

Akan mencoba cara ini dan memperbarui. Terima kasih

@gavinking sepertinya Spring mengimplementasikan @Transactional menggunakan Aspect. Ini tidak terlalu penting, tetapi mungkin juga lebih mudah untuk kita terapkan.
Tapi saya pikir kita tidak bisa melakukannya hanya jika Anda mengekspos API untuk openTransaction() commitTransaction() dan rollbackTransaction() di kelas Stage, karena kita memiliki API openSession() dan closeSession(). Saya pikir objek transaksi diperlukan, dan withTransaction tidak cukup.
Apakah masuk akal ?

Seharusnya ada semacam gagasan tentang pencegat "sekitar" yang memungkinkan Anda membungkus dan meneruskan ke metode ini.

(Memang benar bahwa Anda tidak dapat melakukannya dengan pencegat sebelum/sesudah.)

@gavinking dapatkah Anda menjelaskan tentang apa yang Anda tulis sebelumnya "Dalam tumpukan kami itu akan dilakukan menggunakan Konteks MP." untuk memeriksa apakah transaksi sudah terikat dalam aliran saat ini? Bisakah Anda merujuk ke kode, atau tes yang ditulis. Sama untuk sesi, bagaimana saya bisa memahami bahwa sesi sudah terbuka di aliran saat ini.
Terima kasih.

Dengar, saya tidak tahu bagaimana Anda melakukannya di musim semi. Anda memerlukan semacam konstruksi yang agak seperti threadlocal, tetapi terikat lokal ke aliran reaktif saat ini alih-alih utas. Saya yakin mereka pasti punya sesuatu.

Saat ini saya tidak akan menggunakan spring @Transactional tetapi menerapkan anotasi transaksional kami sendiri untuk menghindari terlalu jauh ke dalam Spring. Jadi pertanyaan saya sebelumnya terkait dengan kalimat Anda "Dalam tumpukan kami yang akan dilakukan menggunakan Konteks MP".

"tumpukan kami" == Quarkus.

Saya mengatakan Anda harus menemukan sesuatu yang serupa di lingkungan Spring.

Karena jika Anda tidak dapat mengikat nilai ke aliran reaktif saat ini, maka Anda tidak dapat memiliki transaksi deklaratif, sesederhana itu, dan Anda hanya perlu mengelola transaksi "secara manual". (Yang sebenarnya sangat sederhana dengan hanya memanggil withTransaction() . Saya benar-benar tidak mengerti mengapa orang berpikir mereka membutuhkan anotasi untuk itu.)

Tapi saya yakin pasti ada cara untuk melakukannya. Anda hanya bertanya pada orang yang salah.

Penutupan: digantikan oleh #782.

@yaakov-berkovitch dengan hal-hal yang saya lakukan dengan #779 seharusnya lebih mudah bagi Anda untuk mengimplementasikan ini.

@gavinking Terima kasih!!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

hantsy picture hantsy  ·  7Komentar

arifpratama398 picture arifpratama398  ·  10Komentar

Sanne picture Sanne  ·  12Komentar

aguibert picture aguibert  ·  28Komentar

gavinking picture gavinking  ·  6Komentar