4.1 লেনদেন এবং ডাটাবেস অখণ্ডতা

একটি ডাটাবেসের অপারেশনের স্বাভাবিক মোড হল যখন এটি প্রতি মিনিটে শত শত বিভিন্ন ক্লায়েন্টের কাছ থেকে হাজার হাজার অনুরোধ গ্রহণ করে। এই ক্ষেত্রে, পরিস্থিতি প্রায়ই দেখা দেয় যখন একই ডেটা বিভিন্ন প্রশ্ন থেকে অ্যাক্সেস করা হয়।

কম প্রায়ই, কিন্তু, আবার, সময়ে সময়ে এমন পরিস্থিতি থাকে যখন একটি অনুরোধ একটি নির্দিষ্ট লাইন পড়ে এবং অন্য একটি অনুরোধ একই সময়ে এটি পরিবর্তন করে। ভাবুন তো কি হবে যদি কেউ এমন একটি লাইন পড়ে যা অর্ধেক পরিবর্তিত হয়? কিছুই ভালনা.

এই সমস্যাটি বিভিন্ন উপায়ে সমাধান করা হয়। প্রথমত, আপনি পরিবর্তন হওয়া লাইনটি লক করতে পারেন। পড়ার জন্য এবং লেখার জন্যও। এই পদ্ধতিটি কাজ করে, তবে বেসের গতি ব্যাপকভাবে ক্ষতিগ্রস্ত হয়।

দ্বিতীয় উপায় হল শুধুমাত্র লেখার জন্য স্ট্রিং লক করা। যাইহোক, এখনও একটি সমস্যা হবে যখন কেউ আংশিকভাবে পরিবর্তিত লাইন পড়ার চেষ্টা করে। উপসংহার - লাইনটি আংশিকভাবে পরিবর্তিত হলে এমন পরিস্থিতি থাকা উচিত নয়।

অতএব, তারা একটি তৃতীয় পদ্ধতি নিয়ে এসেছিল - লেনদেন। একটি লেনদেন হল কর্মের একটি গোষ্ঠী যা হয় সব একসাথে সঞ্চালিত হয়, বা কোনোটিই নয়। এমন পরিস্থিতি হতে পারে না যেখানে ক্রিয়াগুলির একটি অংশ সঞ্চালিত হয়েছিল এবং দ্বিতীয় অংশটি ছিল না। যদি সমস্ত পরিবর্তন করা সম্ভব না হয়, তবে ইতিমধ্যে করা সমস্ত পরিবর্তনগুলি ফিরিয়ে দেওয়া হয়।

যেকোনো আধুনিক SQL সার্ভার আপনাকে শুধুমাত্র লেনদেনে ডেটা পরিবর্তন করতে দেয়। আপনি একটি লেনদেন খুলবেন, যে কোনো সংখ্যক টেবিলে কোনো পরিবর্তন করবেন এবং লেনদেন করবেন। SQL সার্ভার তারপর পরিবর্তন করার চেষ্টা করে। যদি সবকিছু ঠিকঠাক থাকে, তাহলে সেগুলি সাধারণ ডাটাবেসে যোগ করা হবে। যদি সমস্যা ছিল, তাহলে সমস্ত পরিবর্তন বাতিল করা হবে।

হাইবারনেটও এই দৃষ্টান্ত ব্যবহার করে। এই কারণেই আগের লেকচারে আমরা দেখেছি যে যখন কর্মচারী অবজেক্টটিকে ডাটাবেসে সংরক্ষণ করার চেষ্টা করা হয়েছিল, একটি লেনদেন প্রথমে খোলা হয়েছিল, এবং সংরক্ষণ করার পরে, এটি প্রতিশ্রুতিবদ্ধ হয়েছিল।

আমরা এই বিষয়ে আরও বিশদে যাব, তবে আপাতত, কেন লেনদেন প্রয়োজন এবং সেগুলি সাধারণত কোথায় ব্যবহার করা হয় তা জানুন।

4.2 বস্তু পাওয়া

যদি হাইবারনেট ডেটা পাওয়ার জন্য একটি অনুরোধ কার্যকর করে, তাহলে স্পষ্টভাবে একটি লেনদেন খোলার প্রয়োজন নেই। উপযুক্ত মনে হলে হাইবারনেট নিজেই এটি করবে: এটির সেটিংস রয়েছে, সেইসাথে SQL সার্ভারের সেটিংসও রয়েছে৷

আমরা বিশ্লেষণ করব কিভাবে ডাটাবেস দিয়ে কাজ করতে হয়। এবং তাদের মধ্যে সবচেয়ে সহজ হল তার আইডি দ্বারা একটি বস্তু পাওয়া । এটি করার জন্য, সেশনget() অবজেক্টে পদ্ধতিটি ব্যবহার করুন । এই ধরনের অনুরোধের সাধারণ ফর্ম:

Class Name = session.get(Class.class, ID);

উদাহরণ:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 বস্তু সংরক্ষণ (যোগ)

আপনি যদি আপনার বস্তুটিকে ডাটাবেসে সংরক্ষণ করতে চান, তাহলে SQL স্তরে একটি ক্যোয়ারী চালানো হবেঢোকান. অতএব, আপনার কর্ম একটি পৃথক লেনদেন হিসাবে সঞ্চালিত করা আবশ্যক. এছাড়াও, অধ্যবসায়ের জন্য সেশনpersist() অবজেক্টের পদ্ধতিটি ব্যবহার করা ভাল ।

এই ধরনের অনুরোধের সাধারণ ফর্ম:

session.persist(An object);

পদ্ধতিটি persist()কেবল বেস নয়, বস্তুরও পরিবর্তন করে। জিনিসটি হল যে যখন আমরা ডাটাবেসে একটি বস্তু যোগ করি, তখন এটি যোগ করার আগে এই বস্তুটির নিজস্ব আইডি থাকে না । ভাল, সাধারণত তাই, যদিও সূক্ষ্মতা আছে। এবং অবজেক্ট যোগ করার পরে ইতিমধ্যে একটি আইডি আছে ।

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

সেশন অবজেক্টেরও একটি পদ্ধতি রয়েছে save()যা একটি অনুরূপ ফাংশন সম্পাদন করে। এটা ঠিক যে পদ্ধতিটি save()পুরানো হাইবারনেট স্ট্যান্ডার্ড এবং পদ্ধতিটি persist()JPA স্ট্যান্ডার্ড।

4.4 বস্তু মুছে ফেলা

আপনি যদি একটি বিদ্যমান বস্তু মুছে ফেলতে চান, তাহলে এটি করা খুব সহজ। এটি করার জন্য, সেশন অবজেক্টের একটি বিশেষ পদ্ধতি রয়েছে - remove().

এই ধরনের অনুরোধের সাধারণ ফর্ম:

session.remove(An object);

এবং, অবশ্যই, আসুন একটি উদাহরণ সহ কোড লিখি:

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

কেন এটা এত কঠিন, আপনি জিজ্ঞাসা?

ঠিক আছে, প্রথমত, ডাটাবেসের যেকোনো পরিবর্তনের সবসময়ই ভিন্ন এবং সর্বদা সুস্পষ্ট পরিণতি হয় না। এবং দ্বিতীয়ত, এই অবজেক্টের সাথে চাইল্ড অবজেক্ট যুক্ত থাকতে পারে, ইত্যাদি। তাই মুছে ফেলার পরিস্থিতি প্রায়ই অ-তুচ্ছ হয়।