@Transactional (propagation = Propagation.REQUIRED)

107

jika seseorang dapat menjelaskan apa yang dilakukan anotasi ini dan kapan tepatnya kami menggunakannya:

@Transactional(propagation=Propagation.REQUIRED)

Terima kasih

Adil
sumber
3
Propagation.REQUIRED adalah mode propagasi default Transaksi, jadi Anda tidak perlu menyetelnya secara eksplisit.
mulai

Jawaban:

65

Ketika pengaturan propagasi adalah PROPAGATION_REQUIRED, lingkup transaksi logis dibuat untuk setiap metode di mana pengaturan diterapkan. Setiap lingkup transaksi logis tersebut dapat menentukan status rollback-only secara individual, dengan lingkup transaksi luar yang secara logis independen dari lingkup transaksi dalam. Tentu saja, dalam kasus perilaku PROPAGATION_REQUIRED standar, semua cakupan ini akan dipetakan ke transaksi fisik yang sama. Jadi, penanda khusus rollback yang disetel dalam cakupan transaksi dalam memang memengaruhi peluang transaksi luar untuk benar-benar berkomitmen (seperti yang Anda harapkan).

masukkan deskripsi gambar di sini

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

Guido
sumber
166

Jika Anda membutuhkan penjelasan awam tentang penggunaan di luar yang disediakan di Spring Docs

Pertimbangkan kode ini ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Ketika doSomething () dipanggil, ia tahu ia harus memulai Transaksi di database sebelum dijalankan. Jika pemanggil metode ini telah memulai Transaksi, maka metode ini akan menggunakan Transaksi fisik yang sama pada koneksi database saat ini.

@TransactionalAnotasi ini menyediakan cara untuk memberi tahu kode Anda ketika dijalankan bahwa ia harus memiliki Transaksi. Ini tidak akan berjalan tanpa satu, jadi Anda dapat membuat asumsi ini dalam kode Anda bahwa Anda tidak akan tertinggal dengan data yang tidak lengkap di database Anda, atau harus membersihkan sesuatu jika terjadi pengecualian.

Manajemen transaksi adalah topik yang cukup rumit jadi semoga jawaban yang disederhanakan ini bermanfaat

Brad
sumber
jika menggunakan konfigurasi berbasis proxy untuk mendeklarasikan dan mengakses lapisan DAO, metode ke dalam kelas DAO juga harus dianotasi dengan @Transactional.
Kurapika
Jika Anda telah menambahkan @Transactionalke lapisan layanan Anda, tidak ada persyaratan lebih lanjut untuk juga menambahkan @Transactionalke metode DAO yang dipanggil dalam transaksi itu.
Brad
jika doSomething()memanggil metode bertingkat lain tanpa @transaksional apa pun, apakah transaksi yang sama ini juga akan berlaku untuk metode pemanggilan tersebut?
thisarattr
Ya, selama Thread yang sama digunakan untuk menjalankan metode bersarang (misalnya, Anda tidak membuat Thread baru secara eksplisit). Ini karena transaksi Musim Semi terikat ke Thread saat ini menggunakan variabel ThreadLocal
Brad
15

Dalam aplikasi Spring, jika Anda mengaktifkan dukungan transaksi berbasis anotasi menggunakan <tx:annotation-driven/>dan membuat anotasi kelas / metode apa pun dengan @Transactional (propagation = Propagation.REQUIRED) maka kerangka kerja Spring akan memulai transaksi dan menjalankan metode dan melakukan transaksi. Jika terjadi RuntimeException, maka transaksi akan dibatalkan.

Sebenarnya propagation = Propagation.REQUIRED adalah tingkat propagasi default, Anda tidak perlu menyebutkannya secara eksplisit.

Untuk info lebih lanjut: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

K. Siva Prasad Reddy
sumber
5

Untuk memahami berbagai pengaturan dan perilaku transaksional yang diadopsi untuk manajemen Transaksi, seperti REQUIRED, ISOLATIONdll. Anda harus memahami dasar-dasar manajemen transaksi itu sendiri.

Baca Manajemen trasaksi untuk penjelasan lebih lanjut.

Bitmap
sumber