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

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

WBOY
WBOYke hadapan
2024-02-22 12:31:06663semak imbas

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;

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 = ?;

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

COMMIT;

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam