Rumah > Java > teks badan

Adakah terdapat sebarang penyelesaian untuk melaksanakan operasi pangkalan data yang sama/serupa secara serentak melalui berbilang benang?

WBOY
Lepaskan: 2024-02-22 12:31:06
ke hadapan
633 orang telah melayarinya

Soal Jawab Java dibawakan oleh editor PHP Zimo: Adakah terdapat penyelesaian untuk membolehkan berbilang benang melaksanakan operasi pangkalan data yang sama/serupa pada masa yang sama? Semasa proses pembangunan, isu tentang cara mengendalikan berbilang benang dengan berkesan yang mengendalikan pangkalan data secara serentak sentiasa menarik perhatian ramai. Artikel ini akan memperkenalkan beberapa penyelesaian, termasuk penggunaan kumpulan sambungan pangkalan data, mekanisme penguncian, pemprosesan transaksi dan kaedah lain, untuk membantu pembangun menyelesaikan masalah ini. Mari kita terokai cara melaksanakan operasi pangkalan data serentak berbilang benang untuk meningkatkan prestasi dan kestabilan sistem.

Kandungan soalan

Menggunakan Java, Spring Boot dan Hibernate, adakah terdapat cara untuk membenarkan berbilang benang melakukan operasi yang diberikan secara serentak tanpa menyebabkan kebuntuan atau pengecualian data basi.

Sebagai contoh, katakan alat automasi log masuk dua kali pada masa yang sama, yang mengakibatkan salah satu situasi berikut:

  1. Kebuntuan kerana dua utas (permintaan) mengemas kini rekod pengguna pada masa yang sama, cth. menyimpan tarikh/masa log masuk terakhir pengguna.
  2. Pengecualian data basi kerana satu urutan mengemas kini pengguna sebelum transaksi urutan lain selesai.

Ini boleh diselesaikan dengan menambahkan penyegerakan pada ID pengguna, tetapi perkara seperti itu mesti berlaku di mana-mana sahaja, mengakibatkan potensi penalti prestasi dan menjadikan pangkalan kod lebih kembung dan sukar untuk dikekalkan.

Sebagai alternatif, kita boleh melaraskan tahap pengasingan (mungkin kita boleh menetapkan tahap lalai secara global). Adakah ini penyelesaian yang lebih baik atau ada penyelesaian lain?

Penyelesaian

Kunci Pesimis.

Kunci semua baris yang mungkin perlu dikemas kini pada awal transaksi. Anda boleh melakukan ini menggunakan mengunci baca.

select ... from users where user_id = ? for update;
Salin selepas log masuk

Hanya satu utas akan mendapatnya. Utas lain akan menunggu urutan ini melepaskan kunci.

Sementara itu, benang yang memegang kunci boleh mengemas kini baris apabila siap.

update users set last_login = now() where user_id = ?;
Salin selepas log masuk

Kemudian, untuk bersikap sopan dengan benang lain, sila hantar secepat mungkin selepas update. Ini secara automatik melepaskan kunci.

COMMIT;
Salin selepas log masuk

Ini membolehkan benang beratur seterusnya memperoleh kunci yang sedang ditunggunya.

Anda boleh menggunakan bacaan penguncian untuk mengunci berbilang baris, malah berbilang baris dalam berbilang jadual. select Mana-mana baris yang disemak oleh pertanyaan akan dikunci. Jika anda perlu mengunci baris dalam berbilang jadual, anda boleh melakukan operasi seperti bergabung.

Pemerolehan kunci adalah atom, jadi pernyataan kunci yang diberikan mesti memperoleh semua kunci yang diminta, jika tidak, ia mesti menunggu.

Atas ialah kandungan terperinci Adakah terdapat sebarang penyelesaian untuk melaksanakan operasi pangkalan data yang sama/serupa secara serentak melalui berbilang benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!