Ada berbagai persyaratan yang saling bertentangan yang diungkapkan dalam pertanyaan Anda. Jawaban ini berkonsentrasi pada aspek "keep lock".
Untuk mempertahankan kunci tabel untuk seluruh operasi, Anda harus mempertahankan satu koneksi ke server sql. Salah satu cara akan melewati semuanya sebagai input multi-perintah multi-baris ke satu permintaan klien baris perintah mysql. Pada dasarnya seperti ini:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
Itu akan berhasil selama Anda dapat menghasilkan semua pernyataan yang diperlukan tanpa mengajukan pertanyaan dari database (seperti pengenal maksimal) saat kunci disimpan.
Untuk menggabungkan operasi baca (seperti meminta nilai maksimal) dan operasi tulis (seperti memuat konten beberapa file), Anda memerlukan komunikasi dua arah dengan server. Mencapai ini melalui bash sangat rumit, jadi saya sarankan untuk tidak melakukannya. Bahkan jika Anda tidak perlu mengajukan pertanyaan, koneksi searah yang disediakan oleh pipa bash adalah sumber bahaya:Jika ada yang tidak beres di sisi mysql, bash tidak akan menyadarinya dan akan tetap mengeluarkan perintah berikutnya. Anda mungkin berakhir dengan melakukan data yang tidak konsisten.
Untuk alasan ini, saya lebih suka menyarankan beberapa bahasa skrip yang menyediakan binding mysql, seperti opsi Perl atau Pyhon yang Anda sebutkan. Membaca file CVS dalam bahasa tersebut sangatlah mudah, jadi Anda dapat melakukan semua hal berikut dalam satu skrip:
- mengunci meja
- mulai transaksi
- membaca file csv masukan
- ajukan pertanyaan seperti max id
- menyesuaikan data input agar sesuai dengan tata letak tabel
- menyisipkan data ke dalam tabel
- jika tidak terjadi kesalahan, lakukan transaksi