Penulisan serentak MySQL dan GORM menyebabkan ralat

WBOY
Lepaskan: 2024-02-09 10:30:18
ke hadapan
456 orang telah melayarinya

Penulisan serentak MySQL dan GORM menyebabkan ralat

Masalah penulisan serentak antara MySQL dan GORM sentiasa menjadi pening bagi pembangun. Dalam situasi konkurensi yang tinggi, beberapa utas menulis ke pangkalan data secara serentak boleh menyebabkan data tidak konsisten atau hasil yang salah. Editor PHP Baicao akan menganalisis punca dan penyelesaian masalah ini untuk anda membantu anda mengelakkan masalah yang disebabkan oleh penulisan serentak. Melalui reka bentuk dan pengoptimuman yang munasabah, masalah penulisan serentak MySQL dan GORM boleh diselesaikan dengan berkesan untuk memastikan ketekalan dan ketepatan data.

Kandungan soalan

Saya melaksanakan skrip import csv yang kompleks dalam golang. Saya menggunakan pelaksanaan workerpool. Dalam kumpulan pekerja ini, pekerja menjalankan 1,000 fail csv kecil yang mengkategorikan, melabel dan produk jenama. Mereka semua menulis ke jadual pangkalan data yang sama. Setakat ini baik.

Masalah yang saya hadapi ialah jika saya memilih lebih daripada 2 pekerja, proses ranap secara rawak dengan mesej berikut

Aliran kerja ialah

foreach (csv) {
 workerPool.submit(csv)
}

func worker(csv) {
 foreach (line) {
   import(line)
 }
}

import(line) {
 product = get(line)
 product.category = determine_category(product)
 product.brand = determine_brand(product)
 save(brand)
 product.tags = determine_tags(product)
 //and after all
 save(product)
}
Salin selepas log masuk

Saya cuba membungkus panggilan save() dalam transaksi tetapi ia tidak membantu.

Sekarang saya ada soalan berikut:

  1. Adakah mysql sesuai untuk disimpan ke 1 jadual pada masa yang sama?
  2. Jika transaksi diperlukan untuk menyelesaikan tugasan ini, di manakah ia harus ditetapkan?
  3. Adakah pemacu go sql (ralat sentiasa berlaku dalam packet.go:1102) sesuai untuk melakukan ini?
  4. Bolehkah sesiapa membantu saya (mungkin mengupah beberapa jam)?

Saya betul-betul buntu. Saya juga boleh berkongsi kod sumber jika ia membantu. Tetapi pertama-tama saya ingin tahu sama ada anda rasa ini kod saya atau masalah umum.

Penyelesaian

Buka sambungan pangkalan data baharu dalam setiap goroutine (atau utas, untuk bahasa yang menggunakan utas).

Protokol MySQL adalah stateful, yang bermaksud bahawa jika berbilang goroutine cuba menggunakan sambungan yang sama, permintaan dan respons boleh menjadi sangat mengelirukan.

Anda juga akan menghadapi masalah yang sama apabila cuba berkongsi sebarang jenis sambungan protokol stateful yang lain antara goroutine.

Sebagai contoh ftp juga merupakan protokol stateful, yang mungkin lebih mudah difahami. Goroutine pelanggan mungkin menghantar mesej seperti "Dapatkan fail x" dan jawapannya mestilah satu siri mesej yang mengandungi kandungan fail. Jika goroutine lain cuba menggunakan sambungan yang sama semasa permintaan/tindak balas sedang dijalankan, kedua-dua pelanggan akan keliru. Goroutine kedua akan membaca paket kepunyaan fail yang tidak dimintanya. Goroutine pertama untuk meminta fail akan mendapati bahawa beberapa paket yang dijangka telah dibaca.

Begitu juga, protokol MySQL tidak menyokong berbilang gorout pelanggan yang berkongsi satu sambungan.

Atas ialah kandungan terperinci Penulisan serentak MySQL dan GORM menyebabkan ralat. 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!