2010-12-10 40 views
9

Tôi có một bảng với một lĩnh vực :: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMPmysql trì hoãn chèn timestamp

Câu hỏi của tôi là, nếu tôi sử dụng chèn chậm trên bảng này, dấu thời gian sẽ là thời điểm mà yêu cầu được xếp hàng đợi hoặc thời điểm chèn thực sự được thực hiện?

Trả lời

6

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:

  1. a thread handler cho bảng được tạo ra nếu không có một đã
  2. kiểm tra xử lý cho hay chờ đợi để có được một DELAYED khóa
  3. trình xử lý thực hiện INSERT và đặt hàng cuối cùng vào hàng đợi
  4. khi hàng thực sự được chèn vào, nhật ký nhị phân được cập nhật
  5. 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
  6. 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.

+0

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. –

0

Nó nên dành thời gian của chèn thực tế

1

Bất kể nếu INSERT DELAYED được sử dụng hoặc nếu bảng bị khóa do một luồng hoặc cập nhật khác hoặc không được phép, giá trị ts sẽ mất tương đương với thời gian INSERT được phát hành.

+0

Bạn có nghĩa là INSERT "giả" được thực hiện bởi chuỗi xử lý hoặc INSERT thực sự được thực hiện trong cơ sở dữ liệu. –

+0

Khi lệnh được phát hành bởi chuỗi khách hàng. – Riedsio