Đố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_a
vàtable_b
. - Điền vào
table_a
với 500.000 hàng. - Sao chép dữ liệu từ
table_a
tớitable_b
sử dụngINSERT INTO ... SELECT
tuyê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_b
chứ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ự.