Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Hàm SLEEP() trong MySQL có phải busy-wait không? Cách triển khai

Câu trả lời

Không, hàm SLEEP() của MySQL không phải busy-wait. Nó nhường CPU (sleep thực sự) thay vì vòng lặp kiểm tra liên tục.

Minh họa

Tạo bảng và chèn dữ liệu:

CREATE TABLE DemoTable (FirstName VARCHAR(100));
INSERT INTO DemoTable VALUES ('John'), ('Adam'), ('Bob'), ('Chris'), ('Robert');

Thực hiện truy vấn với SLEEP(10):

SELECT SLEEP(10), FirstName FROM DemoTable;

Kết quả (trả về sau 50 giây = 5 dòng × 10 giây):

+-----------+-----------+
| sleep(10) | FirstName |
+-----------+-----------+
| 0         | John      |
| 0         | Adam      |
| 0         | Bob       |
| 0         | Chris     |
| 0         | Robert    |
+-----------+-----------+
5 rows in set (50.00 sec)

Đặc điểm quan trọng

  • SLEEP() thực thi theo từng dòng (row-by-row).
  • Tổng thời gian = số dòng × số giây sleep.
  • Trả về 0 khi hoàn thành, trả về 1 nếu bị ngắt (KILL QUERY).
  • Không tiêu tốn CPU trong lúc chờ (khác với busy-wait loop).

Ứng dụng thực tế

  • Test timeout, deadlock, replication lag.
  • Mô phỏng latency trong stored procedure.
  • Debug concurrency issues.

Cảnh báo

Không dùng SLEEP() trong production queries - nó khóa kết nối, tăng latency, và có thể gây connection pool exhaustion.