Đối với tôi, tài liệu hơi không rõ ràng:
Phương pháp khóa nội bộ gợi ý rằng, trong một số trường hợp, có thể chèn vào bảng MyISAM trong khi một phiên khác đang đọc từ đó:
Tuy nhiên, Sự cố về khóa bảng hiển thị tình huống mà bảng sẽ bị khóa cho đến khi CHỌN hoàn tất (điều này phù hợp với tình huống của bạn):
Bảng InnoDB triển khai khóa cấp độ hàng, vì vậy chỉ hàng đang được đọc sẽ bị khóa, thay vì toàn bộ bảng.
Thay vì chỉ dựa vào tài liệu, tôi đã thử một thử nghiệm nhỏ:
- Tạo hai bảng có cùng cấu trúc:
table_avàtable_b. - Điền vào
table_avới 500.000 hàng. - Sao chép dữ liệu từ
table_atớitable_bsử dụngINSERT INTO ... SELECTtuyên bố. - Trong quá trình sao chép, hãy sử dụng một phiên khác để chèn một hàng mới vào
table_a. - Kiểm tra xem
table_bchứa bản ghi mới.
Khi cả hai bảng trong đó MyISAM, table_b không chứa bản ghi mới sau bản sao. Khi cả hai bảng trong đó InnoDB, table_b đã chứa bản ghi mới sau bản sao. Tôi đã lặp lại điều này ba lần và như mong đợi, kết quả mỗi lần đều giống nhau.
Vì vậy, trong ngắn hạn, nếu bảng của bạn là MyISAM, nó sẽ bị khóa. Nếu đó là InnoDB, nó sẽ không. Tất nhiên, bài kiểm tra này không xem xét các bản cập nhật, nhưng tôi hy vọng kết quả sẽ tương tự.