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

Cách đặt độ trễ (delay) cho trigger/procedure MySQL?

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