Mengaktifkan Kunci Transaksi di JPA Spring Data

1. Ikhtisar

Dalam tutorial singkat ini, kita akan membahas mengaktifkan kunci transaksi di Spring Data JPA untuk metode kueri khusus dan metode CRUD repositori yang telah ditentukan sebelumnya.

Kami juga akan melihat berbagai jenis kunci dan mengatur batas waktu penguncian transaksi.

2. Jenis Kunci

JPA memiliki dua jenis kunci utama yang ditentukan, yaitu Penguncian Pesimistis dan Penguncian Optimis.

2.1 Penguncian Pesimistis

Saat kami menggunakan Penguncian Pesimistik dalam transaksi dan mengakses entitas, itu akan segera dikunci . Transaksi melepaskan kunci baik dengan melakukan atau memutar kembali transaksi.

2.2 Penguncian Optimis

Dalam Penguncian Optimis, transaksi tidak langsung mengunci entitas. Sebaliknya, transaksi biasanya menyimpan status entitas dengan nomor versi yang ditetapkan untuknya.

Saat kami mencoba memperbarui status entitas di transaksi yang berbeda, transaksi membandingkan nomor versi yang disimpan dengan nomor versi yang ada selama pembaruan.

Pada titik ini, jika nomor versinya berbeda, itu berarti entitas tidak dapat diubah. Jika ada transaksi yang aktif, maka transaksi tersebut akan dibatalkan dan penerapan JPA yang mendasari akan memunculkan OptimisticLockException.

Terlepas dari pendekatan nomor versi, kita dapat menggunakan pendekatan lain seperti stempel waktu, penghitungan nilai hash, atau checksum berseri, bergantung pada pendekatan mana yang paling sesuai untuk konteks pengembangan kita saat ini.

3. Mengaktifkan Kunci Transaksi pada Metode Query

Untuk memperoleh kunci pada suatu entitas, kita dapat membuat anotasi metode kueri target dengan anotasi Kunci dengan meneruskan jenis mode kunci yang diperlukan .

Jenis mode kunci adalah nilai enum yang akan ditentukan saat mengunci entitas. Mode kunci yang ditentukan kemudian disebarkan ke database untuk menerapkan kunci yang sesuai pada objek entitas.

Untuk menentukan kunci pada metode kueri khusus dari repositori JPA Data Musim Semi, kita dapat menganotasi metode tersebut dengan @Lock dan menentukan jenis mode kunci yang diperlukan:

@Lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT) @Query("SELECT c FROM Customer c WHERE c.orgId = ?1") public List fetchCustomersByOrgId(Long orgId);

Untuk memberlakukan kunci pada metode repositori yang telah ditentukan seperti findAll atau findById (id) , kita harus mendeklarasikan metode dalam repositori dan menganotasi metode dengan anotasi Lock :

@Lock(LockModeType.PESSIMISTIC_READ) public Optional findById(Long customerId);

Jika kunci diaktifkan secara eksplisit dan tidak ada transaksi aktif, implementasi JPA yang mendasarinya akan menampilkan TransactionRequiredException .

Jika kunci tidak dapat diberikan dan konflik penguncian tidak mengakibatkan rollback transaksi, JPA akan melontarkan LockTimeoutException . Tapi itu tidak menandai transaksi aktif untuk rollback.

4. Mengatur Batas Waktu Penguncian Transaksi

Saat menggunakan Penguncian Pesimistik, database akan mencoba mengunci entitas dengan segera. Implementasi JPA yang mendasari melontarkan LockTimeoutException saat kunci tidak bisa langsung diperoleh. Untuk menghindari pengecualian seperti itu, kita dapat menentukan nilai batas waktu kunci.

Di Spring Data JPA, waktu tunggu penguncian dapat ditentukan menggunakan anotasi QueryHints dengan menempatkan QueryHint pada metode kueri:

@Lock(LockModeType.PESSIMISTIC_READ) @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "3000")}) public Optional findById(Long customerId);

Detail lebih lanjut tentang menyetel petunjuk batas waktu kunci pada cakupan yang berbeda dapat ditemukan di artikel ObjectDB ini.

5. Kesimpulan

Dalam tutorial ini, kita telah mempelajari berbagai jenis mode kunci transaksi. Kami telah mempelajari cara mengaktifkan kunci transaksi di Spring Data JPA. Kami juga telah membahas pengaturan waktu tunggu penguncian.

Menerapkan kunci transaksi yang tepat di tempat yang tepat dapat membantu menjaga integritas data dalam aplikasi penggunaan bersamaan bervolume tinggi.

Ketika transaksi harus mematuhi aturan ACID secara ketat, kita harus menggunakan Penguncian Pesimistis. Penguncian Optimis harus diterapkan saat kita perlu mengizinkan beberapa pembacaan bersamaan dan saat konsistensi akhirnya dapat diterima dalam konteks aplikasi.

Tentu saja, kode contoh untuk Penguncian Pesimistis dan Penguncian Optimis dapat ditemukan di Github.