cari
RumahJavajavaTutorialMengendalikan Pelaksanaan Asynchronous dengan Transaksi pada Musim Bunga: Perangkap Biasa dan Cara Menyelesaikannya

Handling Asynchronous Execution with Transactions in Spring: A Common Pitfall and How to Solve It

Dalam aplikasi Spring moden, adalah perkara biasa untuk menggabungkan pelaksanaan tak segerak dengan tingkah laku transaksi. Walau bagaimanapun, menganotasi kaedah dengan @Async dan @Transactional(propagation = Propagation.REQUIRES_NEW) mungkin mengakibatkan tingkah laku yang tidak dijangka kerana Spring menguruskan tugasan dan transaksi tak segerak.

Dalam artikel ini, kami akan meneroka isu ini secara terperinci dan menunjukkan penyelesaian untuk mengendalikan kedua-dua pelaksanaan tak segerak dan pengurusan transaksi dengan betul.

Masalahnya: @Async dan @Transactional(propagation = Propagation.REQUIRES_NEW)

Pertimbangkan coretan kod berikut:

@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveSomething() {
    // save-point one
    // save-point two
}

Pada pandangan pertama, nampaknya semuanya berfungsi seperti yang diharapkan. Walau bagaimanapun, terdapat beberapa masalah utama dengan konfigurasi ini yang boleh membawa kepada tingkah laku yang tidak diingini.

Apa yang Berlaku di Sebalik Tabir?

  • @Async Anotasi:

Anotasi @Async memberitahu Spring untuk menjalankan kaedah secara tidak segerak dalam urutan yang berasingan. Ini bermakna kaedah itu tidak akan dijalankan dalam urutan asal yang memanggilnya tetapi akan dimuatkan ke utas lain dalam kumpulan benang.
Spring menggunakan proksi untuk mengurus kaedah tak segerak. Apabila anda memanggil kaedah beranotasi dengan @Async, Spring mewakilkan pelaksanaan kepada Pelaksana dalaman yang menjalankan kaedah dalam urutan yang berbeza.

  • @Transactional(propagation = Propagation.REQUIRES_NEW) Anotasi:

Anotasi @Transactional(propagation = Propagation.REQUIRES_NEW) memastikan transaksi baharu dimulakan untuk kaedah tersebut, tanpa mengira sebarang transaksi sedia ada. Ia menggantung sebarang transaksi aktif dalam urutan panggilan dan memulakan transaksi baharu untuk kaedah tersebut.

Pengurusan urus niaga dalam Spring biasanya terikat pada urutan, bermakna konteks transaksi terikat pada urutan semasa.

Konflik

Isu timbul kerana @Async menjalankan kaedah dalam urutan berbeza dan pengurusan transaksi Spring bergantung pada urutan untuk mengikat transaksi. Apabila kaedah dilaksanakan secara tidak segerak, konteks urus niaga daripada utas panggilan tidak disebarkan ke utas baharu, yang membawa kepada masalah berikut:

  • Anotasi @Transactional tidak akan membuat transaksi baharu dalam urutan async dan sebarang gelagat transaksi (seperti rollback, commit, dll.) tidak akan dikendalikan dengan betul.
  • Tetapan penyebaran REQUIRES_NEW tidak akan digunakan kerana kaedah tak segerak berjalan di luar konteks transaksi asal.

Penyelesaian: Menyahgandingkan Pelaksanaan dan Transaksi Async

Untuk menyelesaikan masalah ini, anda boleh memisahkan pelaksanaan tak segerak daripada logik transaksi dengan mengendalikan transaksi dalam kaedah perkhidmatan yang berasingan. Begini cara anda boleh melakukannya:

  • Langkah 1: Cipta Perkhidmatan Segerak Baharu untuk Logik Transaksi
    Buat perkhidmatan baharu yang mengendalikan logik transaksi. Kaedah ini akan dilaksanakan secara serentak (tanpa @Async) untuk memastikan pengurusan transaksi berfungsi seperti yang diharapkan.

  • Langkah 2: Panggil Kaedah Segerak Secara Asynchronous
    Anda kemudiannya boleh memanggil kaedah transaksi segerak secara tak segerak menggunakan @Async. Ini memastikan bahawa logik transaksi dikendalikan dengan betul dalam urutan utama dan tingkah laku tak segerak masih dikekalkan.

Begini rupa kod yang difaktorkan semula:

@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveSomething() {
    // save-point one
    // save-point two
}

Bagaimana ia berfungsi?

Dalam penyelesaian yang difaktorkan semula, pelaksanaan tak segerak dicapai dengan menganotasi kaedah saveSomethingAsync() dengan @Async. Ini bermakna apabila saveSomethingAsync() dipanggil, ia akan dijalankan dalam urutan berasingan yang diuruskan oleh pelaksana tugas tak segerak Spring. Menjalankan ini dalam urutan lain membolehkan utas utama meneruskan pelaksanaannya tanpa menunggu saveSomethingAsync() selesai. Pendekatan ini berfaedah untuk senario di mana anda ingin memunggah tugasan yang sudah lama berjalan, meningkatkan daya tindak balas atau mengendalikan operasi bebas secara serentak.

Untuk tingkah laku transaksi, kaedah saveSomething() dalam TransactionalService dianotasi dengan @Transactional(propagation = Propagation.REQUIRES_NEW). Ini memastikan bahawa setiap panggilan ke saveSomething() mencipta transaksi baharu bebas daripada sebarang transaksi sedia ada dalam kaedah panggilan. Penyebaran REQUIRES_NEW memulakan transaksi baharu dan menggantung mana-mana transaksi sedia ada, membenarkan saveSomething() beroperasi dalam konteks transaksi terpencil. Ini bermakna walaupun kaedah panggilan asal mempunyai urus niaga, saveSomething() akan berfungsi dalam urus niaga berasingannya sendiri, membolehkan komit terkawal dan rollback hanya untuk operasi ini.

Dengan mengasingkan pelaksanaan tak segerak daripada logik transaksi, kami memastikan pengurusan transaksi berfungsi seperti yang diharapkan. Dalam persediaan ini, konteks transaksi kekal dikendalikan dengan betul dalam kaedah saveSomething(), manakala kaedah saveSomethingAsync() terus dilaksanakan dalam urutan yang berasingan. Pengasingan kebimbangan ini membolehkan kedua-dua faedah pemprosesan tak segerak dan pengurusan transaksi yang boleh dipercayai, membolehkan operasi data yang bebas dan selamat walaupun semasa memproses secara serentak.

Bila Menggunakan Pendekatan Ini?

  • Apabila Pengasingan Transaksi Adalah Kritikal: Jika anda perlu memastikan bahawa operasi tertentu dijalankan dalam transaksi berasingan (iaitu, MEMERLUKAN_BARU), pendekatan ini berfungsi dengan baik.

  • Operasi Asynchronous: Jika anda mempunyai tugasan bebas yang berjalan lama yang perlu dilaksanakan secara tidak segerak tetapi juga memerlukan sempadan transaksi mereka sendiri.

Alternatif: Menggunakan Baris Gilir Mesej untuk Penyahgandingan Lengkap

Jika anda memerlukan penyahgandingan yang lebih maju atau ingin mengendalikan percubaan semula, pengendalian ralat dan proses yang berjalan lama, pertimbangkan untuk memunggah tugasan ke baris gilir mesej seperti Kafka atau RabbitMQ. Dengan menggunakan baris gilir mesej, anda boleh memastikan setiap tugasan berjalan dalam konteksnya sendiri dan transaksi boleh diuruskan secara bebas.

Atas ialah kandungan terperinci Mengendalikan Pelaksanaan Asynchronous dengan Transaksi pada Musim Bunga: Perangkap Biasa dan Cara Menyelesaikannya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Apakah beberapa strategi untuk mengurangkan isu khusus platform dalam aplikasi Java?Apakah beberapa strategi untuk mengurangkan isu khusus platform dalam aplikasi Java?May 01, 2025 am 12:20 AM

Bagaimanakah Java mengurangkan masalah khusus platform? Java melaksanakan platform bebas melalui JVM dan perpustakaan standard. 1) Gunakan bytecode dan JVM untuk abstrak perbezaan sistem operasi; 2) Perpustakaan standard menyediakan API silang platform, seperti laluan fail pemprosesan kelas Paths, dan pengekodan aksara pemprosesan kelas charset; 3) Gunakan fail konfigurasi dan ujian pelbagai platform dalam projek sebenar untuk pengoptimuman dan debugging.

Apakah hubungan antara kebebasan platform Java dan seni bina microservices?Apakah hubungan antara kebebasan platform Java dan seni bina microservices?May 01, 2025 am 12:16 AM

Java'splatformindependenceEnhancesMicroservicesarchitectureByOfferingDeploymentflexability, konsistensi, skalabilitas, andPortability.1) DeploymentflexabilityAllowsMicroserviceStorunonAnanyplatformWithAjvm.2) ConsistencyAcsServicSservicesSimpliesDevelanDanDevelan

Bagaimanakah GraalVM berkaitan dengan matlamat kemerdekaan platform Java?Bagaimanakah GraalVM berkaitan dengan matlamat kemerdekaan platform Java?May 01, 2025 am 12:14 AM

GraalVM meningkatkan kemerdekaan platform Java dalam tiga cara: 1. 2. Persekitaran Runtime Bebas, menyusun program Java ke dalam fail boleh laku tempatan melalui GraalvmnativeImage; 3. Pengoptimuman Prestasi, Graal Compiler menjana kod mesin yang cekap untuk meningkatkan prestasi dan konsistensi program Java.

Bagaimana anda menguji aplikasi Java untuk keserasian platform?Bagaimana anda menguji aplikasi Java untuk keserasian platform?May 01, 2025 am 12:09 AM

Toeffectivelytestjavaapplicationsforplatformcompatebility, ikutiTheSesteps: 1) setupautomatedtestingacrossmultiplePlatformsusingcitoolslikejenkinsorgithubithubactions.2) conductManualtestingonrealhardwaretocatchiscatscienvironments.2)

Apakah peranan pengkompil Java (JAVAC) dalam mencapai kemerdekaan platform?Apakah peranan pengkompil Java (JAVAC) dalam mencapai kemerdekaan platform?May 01, 2025 am 12:06 AM

Penyusun Java menyedari kemerdekaan platform Java dengan menukar kod sumber ke dalam bytecode bebas platform, yang membolehkan program Java dijalankan pada mana-mana sistem operasi dengan JVM dipasang.

Apakah kelebihan menggunakan bytecode ke atas kod asli untuk kemerdekaan platform?Apakah kelebihan menggunakan bytecode ke atas kod asli untuk kemerdekaan platform?Apr 30, 2025 am 12:24 AM

BytecodeachievesplatformindependenceBebyBeingExecutedyavirtualMachine (VM), membolehkanCodeTorunonanyplatformWithTheAppropriatevm.Forexample, JavabytecodecanrunonanydeviceVmm, enabling "

Adakah Java benar-benar 100% platform bebas? Mengapa atau mengapa tidak?Adakah Java benar-benar 100% platform bebas? Mengapa atau mengapa tidak?Apr 30, 2025 am 12:18 AM

Java tidak dapat mencapai kemerdekaan platform 100%, tetapi kemerdekaan platformnya dilaksanakan melalui JVM dan bytecode untuk memastikan kod tersebut berjalan pada platform yang berbeza. Pelaksanaan spesifik termasuk: 1. Kompilasi ke bytecode; 2. Tafsiran dan pelaksanaan JVM; 3. Konsistensi Perpustakaan Standard. Walau bagaimanapun, perbezaan pelaksanaan JVM, sistem operasi dan perbezaan perkakasan, dan keserasian perpustakaan pihak ketiga boleh menjejaskan kebebasan platformnya.

Bagaimanakah pemantauan kod sokongan kemerdekaan platform Java?Bagaimanakah pemantauan kod sokongan kemerdekaan platform Java?Apr 30, 2025 am 12:15 AM

Java menyedari kemerdekaan platform melalui "Tulis sekali, jalankan di mana -mana" dan meningkatkan pemeliharaan kod: 1. Penggunaan semula kod tinggi dan mengurangkan pembangunan pendua; 2. Kos penyelenggaraan yang rendah, hanya satu pengubahsuaian yang diperlukan; 3. Kecekapan kerjasama pasukan tinggi adalah tinggi, mudah untuk perkongsian pengetahuan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa