ডেটা ইন্টিগ্রিটি (Data integrity) সমস্যা রেইলস ডেভেলপাররা যে সবচেয়ে कॉमन ডাটাবেস ইস্যুস ফেস করে। প্রপার ভ্যালিডেশন অনুমতি দেওয়ার পাশাপাশি, সঠিকভাবে ডিজাইন করা ট্রানজ্যাকশন ব্লক নিশ্চিত করে যে আপনার ডেটা আংশিকভাবে তৈরি বা আপডেট হয় না।
তবে, ট্রানজ্যাকশনগুলো আপনার অ্যাপ্লিকেশনকে ক্ষতি পৌঁছে দিতে পারে — অথবা পুরো ডাটাবেসটিকেও ডাউন করে দিতে পারে — যখন সঠিকভাবে ডিজাইন করা হয় না।
এই আর্টিকেল ট্রানজ্যাকশন নিয়ে কাজ করার জন্য সেটি ভালো অনুশীলন (good practices) এর একটি সেট অফার করে। টিপসগুলো খুব সহজ, কিন্তু এগুলো আপনার ট্রানজ্যাকশনগুলো বুলেটপ্রুফ, রিডেবল, এবং রিলেটিভলি সেফ করতে সাহায্য করবে।
ডুব মারি!
১. রেইলসে সম্ভব হলে ব্যাং মেথডস (Bang Methods) ব্যবহার করুন
রেইলসে, ! সাইন বিশিষ্ট মেথড ভার্সন আপনাকে আত্মবিশ্বাস দেয় যে কোনো কিছু ভুল হলে এরর রেইজ (raise) হবে।
উদাহরণস্বরূপ, #save মেথড save! ভার্সনেও বিদ্যমান। আপনি কন্ট্রোলারে এই ভার্সনটি ব্যবহার করতে পারেন যদি আপনি কোনো এরর রেইজ করতে না চান:
উপরের পদ্ধতিটি ট্রানজ্যাকশনে ভালো কাজ করবে না। save ব্যবহার করলে, আমরা প্রসেস রোলব্যাক করতে পারবো না যখন এরর রেইজ হবে। তাই ! ভার্সন মেথডগুলো ব্যবহার করা খুব গুরুত্বপূর্ণ:
উপরে, ট্রানজ্যাকশন সাকসেসফুল হয় এমনকি যদি মেম্বারশিপ রেকর্ড তৈরি না হয়, এবং আমরা ডাটাবেসে একটি গোলমাল ডেটা স্ট্রাকচারের সাথে শেষ হই।
আপনি যদি নিচের ভার্সনটি ব্যবহার করেন, ট্রানজ্যাকশন ActiveRecord::RecordNotSaved এরর দিয়ে রিভার্ট হবে:
২. রেইলস ট্রানজ্যাকশনে এররস সঠিকভাবে হ্যান্ডেল করুন
ট্রানজ্যাকশনে এররগুলো নিয়ে আসলে, কিছু নিয়ম আছে যেগুলো আপনাকে মানতে হবে। এই নিয়মগুলো 따르면, আপনার কোড রিডেবল এবং ভালো কাজ করবে যা অন্যান্য ডেভেলপারদের মধ্যে বিভ্রান্তি বা ডিবাগ করা কঠিন অদ্ভুত আচরণ তৈরি করবে না।
ActiveRecord::StatementInvalid থেকে রescue করবেন না
ActiveRecord::StatementInvalid একটি স্পেশাল এরর যা ডাটাবেস লেভেলে কিছু ভুল হলে রেইজ হয়। কখনো এই এরর থেকে রescue করবেন না। আপনাকে সবসময় স্পষ্টভাবে নোটিফাইড হওয়া উচিত যখন ডাটাবেস কোয়েরির সাথে কিছু ভুল হয়।
নিচের কোড এড়িয়ে চলুন:
সঠিক লেভেলে রescue ব্যবহার করুন
আপনি যদি নিচের লেভেলে rescue ব্যবহার করেন, আপনি এররটি ক্যাচ করবেন:
ট্রানজ্যাকশন রোলব্যাক হবে না কারণ আপনি এররটি ক্যাচ করলেন। এররটি রেইজ হওয়া দিন এবং ট্রানজ্যাকশন ব্লকের বাইরে ক্যাচ করুন:
উপরের পদ্ধতিতে, এরর হলে ট্রানজ্যাকশন রোলব্যাক হয়, এবং আপনি এররটি ক্যাচ করেন। ট্রানজ্যাকশন আচরণ ওভাররাইড না করে ট্রানজ্যাকশনের ভিতরে রেইজ হওয়া এরর ক্যাচ করার সঠিক পদ্ধতি এটিই।
জেনেরিক এরর ক্যাচ করবেন না
আপনার উচিত জেনেরিক এরর মaner StandardError বা ArgumentError ক্যাচ করা এড়িয়ে চলা। এটি আরো সাধারণ রিডেবল এবং সহজে টেস্টেবল কোডের জন্য একটি সাধারণ নিয়ম, কিন্তু এটা মেনশন করা ভালো।
এই এররগুলো ক্যাচ করা ডিবাগিং কঠিন করতে পারে, কারণ কোডের অন্যান্য জায়গা থেকে এই এররগুলো রেইজ হতে পারে। এটি আপনার অ্যাপ্লিকেশনে কিছু গুরুত্বপূর্ণ সমস্যা সাইলেন্ট (silent) করতে পারে যা আপনি সেগুলো রescue করছেন সে জায়গার সাথে অনুপ্রয়োজনীয়ভাবে রিলেটেড নয়।
ActiveRecord-এর ডিফল্ট রোলব্যাক এরর বুদ্ধিমানী ব্যবহার করুন
ActiveRecord একটি নির্দিষ্ট এরর ক্লাস প্রদান করে যা আপনি ট্রানজ্যাকশনের ভিতরে ব্যবহার করতে পারেন একটি সাইলেন্ট রোলব্যাক করার জন্য। আপনি ActiveRecord::Rollback এরর রেইজ করে ট্রানজ্যাকশন রোলব্যাক করবেন, কিন্তু এররটি বাইরে রেইজ হবে না, অন্য এররগুলোর মত। এই আচরণ মনে রাখুন এবং বুদ্ধিমানী ব্যবহার করুন।
৩. রেইলসে ট্রানজ্যাকশন এড়িয়ে চলা উচিত কখন সেটি জানুন
যেকোনো জিনিসের মত, আপনার কোডে ট্রানজ্যাকশন অয়ারইউজ (overuse) করবেন না। উদাহরণস্বরূপ, একটি সাধারণ ভুল হল শুধু একটি কোয়েরি আপনার ট্রানজ্যাকশনে র্যাপ করা। এটা মেনস নয় কারণ, যদি কোয়েরিটি সাফল্য না হয়, রোলব্যাক করার কিছু নেই।
একটি অন্য সাধারণ ভুল হল আপনার ডাটাবেস কলের সাথে অনরিলেটেড কোড ট্রানজ্যাকশনে র্যাপ করা। আপনি এমন পদ্ধতি এড়িয়ে চলবেন, কারণ ট্রানজ্যাকশন কানেকশন ধরে রাখবে যদি না ব্লকের ভিতরের কোড এক্সিকিউট হয়। ব্লকের ভিতরের কোডকে শুধু আপনার ডাটাবেস কল করার জন্য সীমাবদ্ধ রাখুন, যদি সম্ভব হয়।
৪. ট্রানজ্যাকশনের ডিসঅ্যাডভান্টেজগুলো বুঝুন
ট্রানজ্যাকশন ডাটাবেসের ভিতরে ডেটা ইন্টিগ্রিটি মেইনটেইন করতে সাহায্য করে, কিন্তু আপনাকে তাদের ডিসঅ্যাডভান্টেজগুলোও সম্পর্কে জানতে হবে। উদাহরণস্বরূপ, ট্রানজ্যাকশন ব্লকে র্যাপ করা কোয়েরিগুলো সিঙ্গেল কোয়েরির চেয়ে বেশি ডিবি রিসোর্স নেয়।
ট্রানজ্যাকশন ব্যবহার করার আর একটি ড্রব্যাক হল এটি আরও জটিল কোড তৈরি করে। ট্রানজ্যাকশন ভুলভাবে ব্যবহার করা হলে আপনার কোড কম রিডেবল করতে পারে।
৫. ট্রানজ্যাকশন ব্লক সঠিক কনটেক্সটে ব্যবহার করুন
আপনি ট্রানজ্যাকশন মেথড ব্যবহার করতে পারেন যখন একটি ক্লাস ActiveRecord ক্লাস থেকে ইনহেরিট করে। এর মানে এটি নয় যে আপনি কোন ভার্সন ব্যবহার করছেন সেটি মেটার করে না। যদিও ফাংশনাল পারস্পেক্টিভ থেকে এটি মেটার করতে পারে না, কিন্তু কোড রিডেবল নিশ্চিত করার জন্য এটি মেটার করে।
ট্রানজ্যাকশন মেথড ব্যবহারের তিনটি সাধারণ ভার্সন আছে:
আপনি যখন অনেক মডেল ব্যবহার করেন এবং ইনস্ট্যান্স মেথড ইনভোকেশন ক্লাসের সাথে মিক্স করেন ব্লকের ভিতরে, আপনার উচিত ActiveRecord::Base.transaction ব্যবহার করা:
আপনি যদি অধিকাংশে একটি নির্দিষ্ট মডেলের কোড নিয়ে কাজ করেন, ক্লাসে ট্রানজ্যাকশন মেথড ইনভোক করুন:
আপনি যখন একটি মডেল ইনস্ট্যান্সের ওপর অপারেশন করেন, ইনস্ট্যান্স লেভেলে ট্রানজ্যাকশন মেথড ইনভোক করা মেনস করে:
অবশ্য, এই নিয়মগুলো অফিসিয়াল নয়। এগুলো কোড আরও রিডেবল बनाने 위한 সাজেশন মাত্র।
পরবর্তী পদক্ষেপ: আপনার রুবি অন রেইলস প্রজেক্টে ট্রানজ্যাকশন রিভিউ করুন
আশা করি রুবি অন রেইলসে ট্রানজ্যাকশন নিয়ে কাজ করার এই টিপসগুলো আপনার উপযোগী লেগেছে।
আমরা রেইলস ট্রানজ্যাকশন সঠিকভাবে ডিজাইন করার গুরুত্ব কভার করেছি ডেটা ইন্টিগ্রিটি উন্নত করতে এবং নিশ্চিত করতে যে আপনার প্রসেসগুলো বিস্ময়কর সাইড-ইফেক্ট ছাড়া পারফর্ম করে।
তবে, একটি প্রপার এরর হ্যান্ডলিং পলিসি শুধু ট্রানজ্যাকশন ব্যবহার করার সময় উপকারী নয় — এটি আপনার পুরো কোডবেস উন্নত করবে। পরবর্তী বার আপনি আপনার কোড থেকে কিছু এরর এক্সপেক্ট করলে সেটি মনে রাখবেন।
এখন আপনার রুবি অন রেইলস প্রজেক্ট ডিজাইনে ট্রানজ্যাকশন রিভিউ করার চমৎকার সময় যাতে এরর এড়িয়ে যাওয়া যায়। আপনার ডাটাবেসের সাথে দক্ষ এবং নির্ভরযোগ্য কমিউনিকেশন ডিজাইন করুন আপনার অ্যাপ্লিকেশন আরও স্টেবল করতে।
খুশি কোডিং!
P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!
পাওয়েল ডাবরওস্কি (Paweł Dąbrowski)
আমাদের অতিথি লেখক পাওয়েল একটি ওপেন-সোর্স ফ্যান এবং গ্রোথ সিকার (growth seeker) এক দশকത്തেক অধিক অভিজ্ঞতা সহ মানুষ এবং কম্পিউটার উভয়ের জন্য লেখার। তিনি ডটস কানেক্ট করেন হাই-কোডালিটি সফটওয়্যার তৈরি করতে এবং মানুষ ও বিজনেসের সাথে মূল্যবান রিলেশনশিপ বিল্ড করতে।
পাওয়েল ডাবরওস্কির সব আর্টিকেল