Câu trả lời là khi yêu cầu được xếp hàng đợi, nhưng đó là không nhất thiết phải đúng khi yêu cầu được thực hiện, như yêu cầu được xếp hàng đợi sau khi các chủ đề cho bảng được thiết lập nếu chưa có.
Từ mysql 5.1 dev docs:
Các thread thực thi các câu lệnh INSERT , nhưng thay vì viết hàng để bàn, nó đặt một bản sao của hàng thức vào một hàng đợi đó là quản lý bởi trình xử lý. Bất kỳ lỗi cú pháp nào được chú ý bởi luồng và được báo cáo cho chương trình của ứng dụng khách.
Trình tự các sự kiện khi tuyên bố trì hoãn thực thi:
- a thread handler cho bảng được tạo ra nếu không có một đã
- kiểm tra xử lý cho hay chờ đợi để có được một
DELAYED
khóa
- trình xử lý thực hiện
INSERT
và đặt hàng cuối cùng vào hàng đợi
- khi hàng thực sự được chèn vào, nhật ký nhị phân được cập nhật
- handler viết
delayed_insert_limit
hàng tại một thời điểm và thực hiện bất kỳ cấp phát SELECTS
giữa viết
- khi hàng đợi rỗng, các khóa
DELAYED
được phát hành
Tùy thuộc vào việc một sợi cần phải được tạo hay không và làm thế nào phải mất nhiều thời gian để kiểm tra hoặc lấy khóa DELAYED
, thời gian giữa việc thực hiện câu lệnh (bước 0) và việc thực hiện câu lệnh (bước 3) sẽ khác nhau. Sau đó, tùy thuộc vào mức độ lớn của hàng đợi (đặc biệt nếu nó vượt quá delayed_insert_limit
hàng) và cho dù bất kỳ sự cố nào đang chờ xử lý xảy ra, việc ghi sẽ bị trì hoãn bởi một khoảng thời gian không thể đoán trước.
Tôi nghĩ bạn đúng (nhưng không chắc chắn). Bởi vì, nếu chuỗi * thực thi * câu lệnh cho * báo cáo * lỗi cú pháp nếu có, nó có thể cũng sẽ "mở rộng" CURRENT_TIMESTAMP thành dấu thời gian thực. –