Tạo độ trễ (delay) trong MySQL Procedure/Trigger với SLEEP()
Sử dụng hàm SLEEP(seconds) để tạm dừng thực thi trong stored procedure. Lưu ý: KHÔNG nên dùng trong trigger (block row, gây deadlock).
Ví dụ: Procedure delay 20 giây
mysql> DELIMITER //
mysql> CREATE PROCEDURE delayInMessage()
-> BEGIN
-> SELECT SLEEP(20);
-> SELECT 'AFTER SLEEPING 20 SECONDS, BYE!!!';
-> END
-> //
Query OK, 0 rows affected (0.30 sec)
mysql> DELIMITER ;
Gọi procedure:
mysql> CALL delayInMessage();
Kết quả (tốn 20.01 giây):
+-----------+ | SLEEP(20) | +-----------+ | 0 | +-----------+ 1 row in set (20.00 sec) +------------------------------------+ | AFTER SLEEPING 20 SECONDS, BYE!!! | +------------------------------------+ | AFTER SLEEPING 20 SECONDS, BYE!!! | +------------------------------------+ 1 row in set (20.01 sec)
Giải thích SLEEP()
SLEEP(N): Ngủ N giây (có thể số thực: 0.5 = 500ms)- Trả về 0 nếu ngủ đủ thời gian, 1 nếu bị ngắt (KILL QUERY)
- Chỉ hoạt động trong stored program (procedure, function, event)
⚠️ KHÔNG dùng SLEEP() trong TRIGGER
- Trigger chạy đồng bộ trong transaction của câu lệnh kích hoạt
- SLEEP() khóa hàng/bảng → chặn tất cả truy cập khác → deadlock, timeout
- Làm chậm INSERT/UPDATE/DELETE đáng kể
Giải pháp thay thế cho Trigger
- Event Scheduler: Chạy job định kỳ kiểm tra và xử lý
- Application-level: Xử lý delay ở tầng ứng dụng (queue, worker)
- Async notification: INSERT vào bảng queue, worker xử lý sau
Lưu ý
- MAX_EXECUTION_TIME không giới hạn SLEEP()
- Dùng thận trọng, chỉ cho testing/debug/maintenance
- Production: tránh SLEEP() trong luồng chính