একক লেনদেনে কীভাবে 2 ডিএও পদ্ধতি পরিচালনা করবেন?


12

একটি সাক্ষাত্কারে কেউ আমাকে জিজ্ঞাসা করেছিলেন: আমরা কীভাবে একটি একক লেনদেনে 2 টি লেনদেন / দাও পদ্ধতি পরিচালনা করব? পছন্দসই ক্ষমতা:

  1. যদি তাদের মধ্যে কেউ ব্যর্থ হয় তবে আমাদের দুটি পদ্ধতিই রোলব্যাক করা দরকার।
  2. উভয় পদ্ধতিই একক লেনদেনের সাথে পৃথকভাবে সংযুক্ত বলা যেতে পারে।
  3. পরিচালনা ডিএও স্তরতে হওয়া উচিত, পরিষেবা স্তরে নয়।

আমি মনে করি: প্রশ্নটি বসন্তের লেনদেন পরিচালনার সাথে সম্পর্কিত।

উত্তর:


12

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

ইন্টারনেটে প্রচুর আলোচনা রয়েছে যা এখানে , এখানে এবং এখানে যেমন নির্দেশ করে ।

যাইহোক, এটি একটি ইন্টারভিউ যেহেতু আসুন প্রশ্নটি গ্রহণ করুন। আমার দৃষ্টিকোণ থেকে, আপনি @Transactionalউভয় পদ্ধতিতে টিকা (বা এক্সএমএল কনফিগারেশন) এবং REQUIREDমান সহ লেনদেনের প্রচার সহ ব্যবহার করবেন । এইভাবে, যখন এই পদ্ধতিরগুলির কোনওটি চালু করা হয় এবং যদি কোনও পূর্ববর্তী লেনদেন বিদ্যমান না থাকে, একটি নতুন লেনদেন তৈরি হবে:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}

এর অর্থ foo()এবং bar()একই লেনদেনটি ভাগ করে নেওয়া এবং যদি 1 ব্যর্থ হয় তবে আরও 1 টিও রোলব্যাক করবে? আপনি কিছু ব্যাখ্যা দিতে পারেন?
সতীশ পান্ডে

ভাল, প্রতিটি পদ্ধতি তার নিজস্ব ইউনিট কাজের ঘোষণা করে: tx প্রতিটি পদ্ধতির শেষে প্রতিশ্রুতিবদ্ধ হবে এবং যদি তাদের কোনও ব্যতিক্রম ছুঁড়ে ফেলে তবে তা ঘূর্ণিত হবে।
অ্যালোনসো ডোমিংয়েজ

সুতরাং আমাদের @Transactional(propagation = REQUIRED)প্রচারের জন্য এবং @Transactionalপরিষেবা স্তরটিতে ডিএও স্তর পদ্ধতিতে যুক্ত করা দরকার , তবে আমি যদি @Transactionalডিএও স্তরটিতে রাখার পরিবর্তে কেবল পরিষেবা স্তরটি রাখি তবে পার্থক্য কী?
অতীশ শিম্পি

propagation = REQUIREDলেনদেনিক টীকা প্রচারের জন্য ডিফল্ট মান, সুতরাং এটি লেখার জন্য এটি প্রয়োজনীয় নয়।
ড্যানিয়েল হিগুরাস

2

আমার উত্তরে বসন্ত এবং ফ্রেমওয়ার্ক উপেক্ষা করা ..... ফাংশন প্যারামিটারগুলি ব্যবহারের প্রাথমিক ধারণা। আমি নিশ্চিত যে ধারণাটি এখানে [ফ্রেমওয়ার্ক sertোকান] এর মধ্যে প্রয়োগ করতে পারে।

আপনার 2 ডিএও পদ্ধতির বাইরে কমিট / রোলব্যাক পরিচালনা করতে হবে। 2 টি পদ্ধতির লেনদেন / সংযোগটি ইনপুট হিসাবে নেওয়া দরকার।

স্যুইডো কোড:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}

1 প্রশ্ন: কেন আমরা Tran tউভয় পদ্ধতির সাথে পরামিতি হিসাবে পাস করছি । আপনি কিছু ব্যাখ্যা দিতে পারেন?
সতীশ পান্ডে

@ সতীশ, কারণ প্রশ্নে (আইটেম # 1 এবং # 2), ডিএও পদ্ধতিগুলির স্বতন্ত্রতার সাথে পাশাপাশি নির্ভরশীলতার জন্যও নমনীয়তা থাকা দরকার। যদি আপনি লোকাল-স্কোপ লেনদেনের সাথে মেথড 1 এর ভিতরে প্রতিশ্রুতিবদ্ধ হন তবে মেথড 2 চালু করার আগে আপনি ইতিমধ্যে মেথড 1 প্রতিশ্রুতিবদ্ধ হয়ে গেছেন এমন পদ্ধতি 2 তে কিছু ভুল হয়ে গেলে আপনি ফিরে যেতে পারবেন না।
মাইক 30

0

একটি সুযোগ আছে যে দুটি পদ্ধতি স্বাধীনভাবে একই সময়ে কাজ করতে হবে একই সময়ে সেখানে একই লেনদেন চলতে পারে o সুতরাং আমাদের প্রচার-প্রয়োজনীয় ব্যবহার করতে হবে। যদি লেনদেনটি একই লেনদেনে চালাতে হয় তবে এটি প্রথম লেনদেনটি ব্যবহার করবে অন্যথায় স্বতন্ত্রভাবে আহবান করা হলে একটি নতুন লেনদেন তৈরি হয়। আমি ভুল হলে আমাকে সংশোধন করুন।


আপনি একটি উদাহরণ প্রদান করতে পারেন দয়া করে?
জে এলস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.