@ ট্রান্সজেকশনাল পদ্ধতি @ ট্রান্সজেকশনাল এন্টেশন ব্যতীত অন্য পদ্ধতি কল করছে?


89

আমি একটি পরিষেবা শ্রেণিতে এমন একটি পদ্ধতি দেখেছি যা চিহ্নিত হয়েছে @Transactional, তবে এটি একই শ্রেণিতে কিছু অন্যান্য পদ্ধতিও কল করছে যা চিহ্নিত হয়নি @Transactional

এর অর্থ কি এই যে পৃথক পদ্ধতিতে কল করার ফলে অ্যাপ্লিকেশনটি ডিবি-তে আলাদা কানেকশন খুলতে বা অভিভাবক লেনদেন ইত্যাদি স্থগিত করে?

কোনও টিকা ছাড়াই এমন কোনও পদ্ধতির ডিফল্ট আচরণ কী যা @Transactionalএনেটেশন সহ অন্য পদ্ধতি দ্বারা ডাকা হয় ?

উত্তর:


119

যখন আপনি @Transactionalকোনও লেনদেনের ব্লক ছাড়াই কোনও পদ্ধতিকে কল করেন তখন পিতামাতার লেনদেনটি নতুন পদ্ধতিতে চালিয়ে যাবে। এটি প্যারেন্ট পদ্ধতি থেকে (একই) একই সংযোগ ব্যবহার করবে @Transactionalএবং ডাকা পদ্ধতিতে যে কোনও ব্যতিক্রম @Transactionalঘটবে (তা ছাড়াই লেনদেনের সংজ্ঞাতে কনফিগার হওয়া হিসাবে লেনদেনকে রোলব্যাক করবে)।

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

আপনি বিভাগে আরও বিস্তারিত জানতে পারেন ঘোষণামূলক লেনদেন ব্যবস্থাপনা এর বসন্ত লেনদেন ডকুমেন্টেশন

বসন্তের ঘোষণামূলক লেনদেনের মডেল এওপি প্রক্সি ব্যবহার করে uses সুতরাং লেনদেন তৈরির জন্য এওপি প্রক্সি দায়বদ্ধ। এওপি প্রক্সি কেবল তখনই সক্রিয় থাকবে যখন উদাহরণ সহ পদ্ধতিগুলি উদাহরণের বাইরে থেকে ডেকে আনা হবে।


এটা কি বসন্তের ডিফল্ট আচরণ?
Goé

হ্যাঁ. এটি ডিফল্ট আচরণ।
অরুণ পি জনি

4
@ টমাসজ হ্যাঁ তবে এটিও উল্লেখ করা উচিত যে অন্য @ ট্রান্সজেকশনাল পদ্ধতি থেকে ডাকা একটি পদ্ধতিতে লেনদেনের প্রচারের কোনও প্রভাব পড়বে না।
ফিল্ড

4
@ টমাসজ, এটিই আমি বলার দ্বারা বোঝাতে চাইছিলাম will follow the transaction definitions given in the called method। কিন্তু যদি কলটি একই অবজেক্ট উদাহরণ থেকে আসে তবে এর কোনও প্রভাব পড়বে না কারণ কলটি লেনদেন রক্ষণাবেক্ষণের জন্য দায়ী আওপ প্রক্সির মাধ্যমে প্রচার করবে না।
অরুণ পি জনি

4
@ ফিলিপ, এটি সম্পূর্ণ সঠিক নয়, যদি আপনি @Transactionalকোনও ভিন্ন অবজেক্ট / উদাহরণ থেকে কোনও সংজ্ঞা দিয়ে কোনও পদ্ধতি কল করেন তবে কলিং পদ্ধতির আলাদা আলাদা @Transactionalবৈশিষ্ট্য থাকা সত্ত্বেও, তথাপি পদ্ধতিটি তার নিজস্ব লেনদেন সংজ্ঞা অনুসরণ করবে।
অরুণ পি জনি

24
  • এর অর্থ কি পৃথক পদ্ধতির কলের ফলে অ্যাপ্লিকেশনটি ডিবি-তে আলাদা কানেকশন খুলতে বা পিতামাতার লেনদেন ইত্যাদি স্থগিত করে?

এটি একটি প্রচার স্তরের উপর নির্ভর করে । এখানে সমস্ত সম্ভাব্য স্তরের মান রয়েছে

ক্ষেত্রে উদাহরণস্বরূপ একটি প্রসারণ স্তর নেস্টেড একটি বর্তমান লেনদেনের 'স্থগিত' হবে এবং একটি নতুন লেনদেনের তৈরি করা হবে ( নোট: একটি নেস্টেড লেনদেনের প্রকৃত সৃষ্টি শুধুমাত্র নির্দিষ্ট লেনদেনের পরিচালকদের কাজ করবে )

  • কোনও ট্র্যাকশন ছাড়াই কোনও পদ্ধতির ডিফল্ট আচরণ কী যা @ ট্রান্সজেকশনাল টিকা দিয়ে অন্য পদ্ধতিতে ডাকা হয়?

ডিফল্ট প্রসারণ স্তর (কি আপনি "ব্যবহার" বলি) REQUIRED টি । যদি কোনও "অভ্যন্তরীণ" পদ্ধতিটি বলা হয় যার @Transactionalউপর এটিতে টীকা থাকে (বা এক্সএমএলের মাধ্যমে ঘোষণামূলকভাবে লেনদেন করা হয়), এটি একই লেনদেনের মধ্যে কার্যকর করা হবে , যেমন "নতুন কিছু নয়" তৈরি হয়েছে।


NOT_SUPPORTED এর সাবকলগুলি সম্পর্কে কী যে কোনও টিকা নেই? এটি NOT_ সমর্থিত উত্তরাধিকারসূত্রে পাওয়া গেছে বা REQURED ডিফল্ট হওয়ায় তারা কোনও নতুন লেনদেন খুললেন? উদাহরণস্বরূপ: f1.call () {f2 () the এনটোটেশন সহ F1 এর জন্য NOT_SUPPORTED এবং f2 এর জন্য অ নয়।
ডেভ

8

@ ট্রানজেকশনাল লেনদেনের সীমানা চিহ্নিত করে (শুরু / শেষ) তবে লেনদেন নিজেই থ্রেডের সাথে আবদ্ধ। একবার কোনও লেনদেন শুরু হলে মূল পদ্ধতিটি ফিরে না আসা এবং লেনদেনটি কমিট / রোল ফিরে না আসা পর্যন্ত এটি পদ্ধতি কলগুলিতে প্রচার করে।

যদি অন্য একটি পদ্ধতি বলা হয় যার একটি @ ট্রান্সজেকশনাল টিকা আছে তবে প্রচারটি সেই টীকাগুলির প্রচারের বৈশিষ্ট্যের উপর নির্ভর করে।


3 টি উত্তর একে অপরের সাথে কিছুটা ডিগ্রি নিয়ে বিরোধ করে, কোনটি আরও সঠিক তা নিশ্চিত নয়।
ট্রাম্প 2020 - বিচারক

4
@ এরিক ওয়াং কেবল ভাগ করে নিতে চেয়েছিলেন যে আমি আজ এই পরিস্থিতিটি পরীক্ষা করেছি এবং অরুন পি জনির উত্তর (মন্তব্য সহ) অভ্যন্তরীণ আহ্বানের এই দৃশ্যের জন্য সবচেয়ে সঠিক answer
বিনয় বিশ

3

যদি অভ্যন্তরীণ পদ্ধতিটি @ ট্রান্সজেকশনাল দ্বারা টীকাযুক্ত না হয় তবে অভ্যন্তরীণ পদ্ধতি বাইরের পদ্ধতির উপর প্রভাব ফেলবে।

যদি অভ্যন্তরীণ পদ্ধতিটি @ ট্রানজেকশনের সাথেও বেনিফিট হয় তবে REQUIRES_NEWনিম্নলিখিতটি ঘটবে।

...
@Autowired
private TestDAO testDAO;

@Autowired
private SomeBean someBean;

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
  testDAO.insertUser(user);
  try{
    someBean.innerMethod();
  } catch(RuntimeException e){
    // handle exception
  }
}


@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
  throw new RuntimeException("Rollback this transaction!");
}

অভ্যন্তরীণ পদ্ধতিটি REQUIRES_NEWএটিকে রেনটাইম এক্সেপশন দিয়ে টিকা দেওয়া হয় এবং তা ছুড়ে ফেলে তাই এটি তার লেনদেনটি রোলব্যাকে সেট করে তবে বাইরের লেনদেনকে প্রভাবিত করে না। অভ্যন্তরীণ লেনদেন শুরু হয় এবং তারপরে অভ্যন্তরীণ লেনদেন শেষ হওয়ার পরে পুনরায় শুরু হয় বাহ্যিক লেনদেন P তারা একে অপরের থেকে স্বতন্ত্রভাবে চালায় তাই বাইরের লেনদেন মায় সাফল্যের সাথে প্রতিশ্রুতি দেয়।


4
নতুনদের জন্য স্পষ্ট করার জন্য, আমি বেশ নিশ্চিত যে অভ্যন্তরীণ ম্যাথোড () আউটডেমথোড () এর চেয়ে আলাদা শিমের (ওরফে স্প্রিং-পরিচালিত জাভা অবজেক্ট) থাকা উচিত। যদি তারা উভয় একই শিমের হয় তবে আমি মনে করি না যে অভ্যন্তরীণ ম্যাথড তার টীকাতে ঘোষিত লেনদেনমূলক আচরণটি ব্যবহার করবে। বরং এটি বহির্মথোড () ঘোষণায় যা ঘোষিত হয়েছে তা ব্যবহার করবে। এটি কারণ হ'ল স্প্রিং এওপি পরিচালনা করে, যা এটি @ ট্রান্সজেকশনাল টিকা ( দস্তাবেজ। স্প্রিং.ইও
স্প্রিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.