4.1 হাইবারনেটে লেনদেনের ভূমিকা

উপরের সকলের সাথে, আমি লেনদেন সম্পর্কে তথ্য যোগ করতে চাই। আপনি ইতিমধ্যেই জানেন, একটি লেনদেন হল একটি ক্রিয়াকলাপের গোষ্ঠী যা শুধুমাত্র একসাথে করা উচিত । যদি কোনো ক্রিয়া ব্যর্থ হয় বা কোনো ত্রুটির সাথে সম্পাদিত হয়, তাহলে অন্য সব কর্ম বাতিল করতে হবে।

হাইবারনেট দুটি ধরণের লেনদেনের সাথে কাজ করতে সক্ষম:

  • জেডিবিসি
  • জেটিএ

একটি JDBC লেনদেন আসলে একটি ডাটাবেস লেনদেন। এটি ডাটাবেসের সাথে কাজ করার সাথে, JDBC সংযোগের সাথে সংযুক্ত। এবং তিনি নিশ্চিত করেন যে ডাটাবেসের সাথে কাজ করার সময় ক্রিয়াগুলি যেমন করা উচিত সেভাবে সঞ্চালিত হয়: হয় সব বা কিছুই নয়।

JTA - লেনদেন একটি অ্যাপ্লিকেশন স্তরের লেনদেন। এটি কোনো ডাটাবেসের সাথে আবদ্ধ নয়। এর কাজ হল নিশ্চিত করা যে নির্দিষ্ট ক্রিয়াগুলি সঞ্চালিত হয়েছে: হয় সমস্ত বা কিছুই নয়।

উদাহরণস্বরূপ, আপনি একটি একক JTA লেনদেনের মধ্যে বিভিন্ন ডেটাবেসে ডেটা লিখতে পারেন। তারপর যদি একটি ত্রুটি ঘটে, তাহলে JTA লেনদেন সমস্ত ডাটাবেসের পরিবর্তনগুলি রোল ব্যাক করতে হবে। এমনকি যেগুলি একটি নির্দিষ্ট ডাটাবেসের পরিপ্রেক্ষিতে সফলভাবে কার্যকর করা হয়েছিল।

4.2 হাইবারনেট লেনদেন ইন্টারফেস

হাইবারনেট লাইব্রেরিতে, একটি লেনদেন লেনদেন ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা হয়, যার বিভিন্ন বাস্তবায়ন থাকতে পারে। উদাহরণস্বরূপ, স্প্রিং এর সাথে কাজ করার সময়, স্প্রিং তার নিজস্ব JTA লেনদেন প্রক্রিয়া প্রদান করে।

এই ইন্টারফেসের পদ্ধতিগুলি হল:

# পদ্ধতি বর্ণনা
1 শুরু() একটি নতুন লেনদেন শুরু করে
2 প্রতিশ্রুতিবদ্ধ() লেনদেন শেষ করে, সমস্ত পরিবর্তন ঠেলে/কমিট করে
3 রোলব্যাক() বর্তমান লেনদেন রোলব্যাক করে
4 সেটটাইমআউট(int সেকেন্ড) সর্বোচ্চ লেনদেন সম্পাদনের সময় সেট করে
5 সক্রিয়() একটি লেনদেন সক্রিয় কি না তা পরীক্ষা করে
6 রোলডব্যাক() লেনদেন স্বাভাবিকভাবে রোল ব্যাক হয়েছে কিনা তা পরীক্ষা করে
7 প্রতিশ্রুতিবদ্ধ ছিল() লেনদেন স্বাভাবিকভাবে হয়েছে কিনা তা পরীক্ষা করে
8 রেজিস্টার সিঙ্ক্রোনাইজেশন() লেনদেন নিয়ন্ত্রণ করতে একটি কলব্যাক নিবন্ধন করে

গুরুত্বপূর্ণ ! একটি লেনদেন বস্তু তৈরি করা এবং একটি লেনদেন শুরু করা দুটি ভিন্ন জিনিস। এখানে আপনি থ্রেড ক্লাসের সাথে একটি সাদৃশ্য আঁকতে পারেন। আপনি যখন একটি Thread() অবজেক্ট তৈরি করেন, JVM এখনও একটি নতুন থ্রেড শুরু করে না। এটি শুরু করতে, আপনাকে থ্রেড অবজেক্টে start() পদ্ধতিতে কল করতে হবে। এটি একটি লেনদেনের সাথে একই - এটি begin() পদ্ধতিতে কল করতে হবে।

হাইবারনেটে সাধারণত কীভাবে লেনদেন পরিচালনা করা হয় তার একটি উদাহরণ:


Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
    transaction.begin();
    Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
    transaction.commit();
}
catch (Exception e) {
	if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
    transaction.rollback();
    }
}
finally {
	session.close();
	sessionFactory.close();
}

আমরা এখানে তিনটি জিনিস দেখতে পাই:

প্রথমত, ডাটাবেসের সাথে সমস্ত কাজ কলিং পদ্ধতির মাধ্যমে একটি লেনদেনে মোড়ানো হয় begin()এবং commit()এই দুটি পদ্ধতিতে কলের মধ্যে সমস্ত ক্রিয়া সম্পাদন করতে হবে: হয় সব একসাথে, বা কিছুই না।

দ্বিতীয়ত, কোনো ত্রুটি দেখা দিলে, আমরা লেনদেনটি রোলব্যাক করার চেষ্টা করি - কল করুন rollback()begin()এর মানে হল যে TransactionManger প্রথমে এবং এর মধ্যে থাকা সমস্ত ক্রিয়া রেকর্ড করতে হবে commit()এবং তারপরে আমরা কল করলে সবকিছু যেমন ছিল তেমনই ফিরিয়ে দিতে হবে rollback()

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

4.3 লেনদেন ব্যবস্থাপক

একটি লেনদেন পরিচালনার দৃষ্টিকোণ থেকে, হাইবারনেট হল JDBC-এর জন্য একটি হালকা ওজনের বস্তুর মোড়ক। হাইবারনেট নিজেই লেনদেন প্রক্রিয়াকরণ বৈশিষ্ট্য নেই. হাইবারনেট লেনদেন আসলে অন্তর্নিহিত JDBC লেনদেনের (বা JTA লেনদেনের মোড়ক) একটি মোড়ক। JDBCT ট্রানজ্যাকশন ডিফল্ট। হাইবারেন্ট সেটিংস ফাইল থেকে উদাহরণ:


hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

আসুন লেনদেন ব্যবহার করে আমাদের কোডটি আরও একবার দেখে নেওয়া যাক:


Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();

এখন জেডিবিসিটি ট্রানজেকশন ক্লাস কোড দেখি:


public class JDBCTransaction implements Transaction {
 
    public void begin() throws HibernateException {
    	...
    	if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
    	...
    }
}

এটি একটি লেনদেন শুরু করার পদ্ধতি। তারপর পাঠান পদ্ধতি দেখুন:


public void commit() throws HibernateException {
    ...
    jdbcContext.connection().commit();
    ...
    jdbcContext.connection().setAutoCommit( true );
    ...
}

এখন এই কোডটিকে হাইবারনেট উদাহরণ কোডে প্রতিস্থাপন করা যাক:

হাইবারনেট সহজ JDBC কোড

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the database
session.flush();
transaction.commit();
session.close();

Connection conn = jdbcContext.connection();
conn.setAutoCommit(false);
 
//here is your database code
conn.commit ()
conn.setAutoCommit(true);
conn.close();

তাই নেটিভ হাইবারনেট লেনদেন হল ডাটাবেসে শুধুমাত্র নেটিভ জেডিবিসি কল। বেশিও না আবার কমও না। তবে জেটিএ লেনদেন আরও আকর্ষণীয়। কিন্তু অন্য সময় যে সম্পর্কে আরো.