MySQL-এ স্টোরড প্রসিডিউর বা ট্রিগারের এক্সিকিউশনে কৃত্রিম ডিলে যোগ করতে SLEEP(seconds) ফাংশন ব্যবহার করুন। এটি মূলত টেস্টিং, ডিবাগিং বা রেট লিমিটিংয়ে কাজে লাগে।
সিনট্যাক্স
SELECT SLEEP(seconds); -- সেকেন্ডে (ফ্লোটিং পয়েন্ট সাপোর্টেড)
স্টোরড প্রসিডিউরে উদাহরণ
DELIMITER //
CREATE PROCEDURE delay_message()
BEGIN
SELECT SLEEP(20); -- ২০ সেকেন্ড অপেক্ষা
SELECT 'AFTER SLEEPING 20 SECONDS, BYE!!!' AS message;
END //
DELIMITER ;
-- কল
CALL delay_message();
ফলাফল
+-----------+
| SLEEP(20) |
+-----------+
| 0 | -- ২০ সেকেন্ড পর রিটার্ন
+-----------+
1 row in set (20.00 sec)
+------------------------------------+
| message |
+------------------------------------+
| AFTER SLEEPING 20 SECONDS, BYE!!! |
+------------------------------------+
1 row in set (20.01 sec)
ট্রিগারে SLEEP (সতর্কতা: লক হোল্ড করে)
CREATE TRIGGER trg_slow_insert
BEFORE INSERT ON sensitive_table FOR EACH ROW
BEGIN
SELECT SLEEP(0.1); -- ১০০ms ডিলে
END;
সতর্কতা: ট্রিগারে SLEEP ব্যবহার করলে লক হোল্ড থাকে, কনকারেন্সি হামার করতে পারে। প্রোডাকশনে এড়ান।
ব্যবহারিক কেস
- টেস্টিং: টাইমআউট, রেট্রি লজিক, ডেডলক সিমুলেশন
- রেট লিমিটিং: API কল লিমিট করার জন্য (বেটার: অ্যাপ্লিকেশন লেভেলে)
- ডিবাগিং: স্লো ক্যোয়ারি সিমুলেট করতে
বিকল্প: বাজে প্র্যাকটিস এড়াতে
প্রোডাকশনে ডিলে যোগ করার পরিবর্তে:
- অ্যাপ্লিকেশন লেভেলে রেট লিমিটার (Token Bucket, Leaky Bucket)
- কানেকশন পুল টাইমআউট কনফিগারেশন
- অ্যাসিঙ্ক্রোনাস প্রসেসিং (মেসেজ কিউ)
সেশন টাইমআউট সতর্কতা
SLEEP সময় wait_timeout / interactive_timeout অতিক্রম করলে কানেকশন ড্রপ হতে পারে।