javax.transaction. ট্রানজেকশনাল বনাম org.springframework.transaction.annotation. ট্রানজেকশনাল


152

আমি বুঝতে পারি না টীকা javax.transaction.Transactionalএবং এর মধ্যে আসল পার্থক্য org.springframework.transaction.annotation.Transactionalকী?

এর org.springframework.transaction.annotation.Transactionalএকটি এক্সটেনশন javax.transaction.Transactionalবা তাদের সম্পূর্ণ আলাদা অর্থ রয়েছে? তাদের প্রতিটি ব্যবহার করা উচিত? @Transactinalসার্ভিস লেয়ারে বসন্ত এবং ডিএওতে জাভাক্স ?

উত্তর করার জন্য ধন্যবাদ.

উত্তর:


125

বসন্তটি বহু বছর আগে স্প্রিং শিমের পদ্ধতিগুলি লেনদেনের জন্য তার নিজস্ব লেনদেনের টীকাকে সংজ্ঞায়িত করেছে।

জাভা ই ই 7 শেষ পর্যন্ত একই জিনিসটি করেছে এবং এখন সিজেআই শিম পদ্ধতিগুলি ইজেবি পদ্ধতিগুলি ছাড়াও লেনদেনের অনুমতি দেয়। জাভা EE 7 যেহেতু, এটি তার নিজস্ব লেনদেনের টীকাকেও সংজ্ঞায়িত করে (এটি স্প্রিংটিকে পুনরায় ব্যবহার করতে পারে না)।

একটি জাভা ইই 7 অ্যাপ্লিকেশনটিতে, আপনি জাভা ইই টীকাটি ব্যবহার করবেন।

একটি স্প্রিং অ্যাপ্লিকেশনে, আপনি স্প্রিং টীকা ব্যবহার করবেন।

তাদের ব্যবহার একই: পাত্রে (জাভা ইই বা স্প্রিং) কে জানানো হচ্ছে যে কোনও পদ্ধতি লেনদেনযোগ্য।


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

16
তদ্ব্যতীত, org.springframework.transaction.annotation.Transactionalঅফার আরও বিকল্প (যেমন readOnly, timeout) তুলনায়javax.transaction.Transactional
pierrefevrier

1
@ ইউরা, কোন সমস্যা আপনি দেখেছেন?
লি চি কিম

1
@ লিচিহিম দয়া করে নীচে দুটি উত্তর দেখুন
ইউরি নাকনটেকায়ি

50

আরেকটি পার্থক্য হ'ল স্প্রিং কীভাবে @ লেনদেনের টীকাগুলি পরিচালনা করে

  • org.springframework.transaction.annotation.Transactional সর্বদা আমলে নেওয়া হয়
  • javax.transaction . ট্রানজেকশনাল তখনই বিবেচনা করা হয় যখন EJB3 লেনদেন উপস্থিত থাকে। EJB3 লেনদেনের উপস্থিতি ক্লাসপথে ক্লাসপথ javax.ejb.TransactionAttributeউপলব্ধ কিনা তা যাচাই করেই করা হয় (সংস্করণ 2.5.3 থেকে 3.2.5 পর্যন্ত)। সুতরাং আপনি অ্যাকাউন্টে আপনার টীকা নেয়া হচ্ছে না দিয়ে শেষ করতে পারেন শুধুমাত্র javax.transaction.Transactionalআপনার ক্লাসপাথ এবং নয় javax.ejb.TransactionAttribute। আপনি যদি হাইবারনেট নিয়ে কাজ করছেন তবে এটি হতে পারে: হাইবারনেট-কোর (৪.৩..7. ফিনাল) jboss- লেনদেন-এপিআই_২_স্পেক (১.০.০.ফাইনাল) এর উপর নির্ভর করে, যা সরবরাহ করে না javax.ejb.TransactionAttribute

9
আমি মনে করি এটি স্প্রিং ৪.২.০ এর সাথে আর কোনও সমস্যা নয়: জাভ্যাক্স.ট্রান্সজেকশন।
আরেন্ড ভি।

এটি সর্বদা নেওয়া হয় না, যদি এটি কোনও ব্যক্তিগত পদ্ধতিতে উদাহরণস্বরূপ নেওয়া হয় না।
স্ট্র্যাশ

36

দয়া করে সাবধান হন, (এই বিষয়টি টমক্যাটে ঘটেছে),

যদি আপনার অ্যাপ্লিকেশনটি স্প্রিং ওয়েব অ্যাপ্লিকেশন হয় এবং আপনি স্প্রিংয়ের লেনদেন হ্যান্ডলিং মেকানিজমটি ব্যবহার করছেন @org.springframework.transaction.annotation.Transactionalতবে এটি জাভ্যাক্স.ট্রান্সজেকশন T ট্রান্সজেকশনালের সাথে মিশ্রিত করবেন না।

এটি @org.springframework.transaction.annotation.Transactionalএকটি বসন্ত অ্যাপ্লিকেশনটিতে অবিচ্ছিন্নভাবে সর্বদা ব্যবহার করা হয় ।

অন্যথায় আমরা এই ত্রুটিটি দিয়ে শেষ করতে পারি,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]

1
দ্রষ্টব্য: এই উত্তরটি আমার উত্তরের একটি বিশেষ ঘটনা
জিদিহেম

3

ঘোষণামূলক লেনদেনের সুযোগ

স্প্রিং এবং জেপিএ @Transactionটীকা উভয়ই আপনাকে প্রদত্ত অ্যাপ্লিকেশন লেনদেনের সুযোগটি নির্ধারণ করতে দেয়।

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

বসন্ত @Transactional

org.springframework.transaction.annotation.Transactionalটীকা স্প্রিং কাঠামোর 1.2 সংস্করণ (2005 প্রায়) যেহেতু উপলব্ধ করা হয়েছে, এবং এটি আপনি নিম্নলিখিত লেনদেনের বিশিষ্টতাগুলি সেট করার জন্য অনুমতি দেয়:

  • isolation: অন্তর্নিহিত ডাটাবেস বিচ্ছিন্নতা স্তর
  • noRollbackForএবং noRollbackForClassName: জাভা Exceptionক্লাসগুলির তালিকা যা কোনও লেনদেন রোলব্যাকটি ট্রিগার না করে ট্রিগার করা যায়
  • rollbackForএবং rollbackForClassName: জাভা Exceptionক্লাসগুলির তালিকা যা নিক্ষেপ করার সময় একটি লেনদেন রোলব্যাককে ট্রিগার করে
  • propagation: Propagationএনাম দ্বারা প্রদত্ত লেনদেন প্রচারের ধরণ । উদাহরণস্বরূপ, যদি লেনদেনের প্রসঙ্গটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে (যেমন, REQUIRED) বা একটি নতুন লেনদেনের প্রসঙ্গ তৈরি করা উচিত (উদাহরণস্বরূপ REQUIRES_NEW) বা কোনও ব্যতিক্রম নিক্ষেপ করা উচিত যদি কোনও লেনদেনের প্রসঙ্গ উপস্থিত না থাকে (যেমন, MANDATORY) বা যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া উচিত যদি কোনও বর্তমান লেনদেনের প্রসঙ্গ পাওয়া যায় (যেমন, NOT_SUPPORTED)।
  • readOnly: বর্তমান লেনদেনের কোনও পরিবর্তন প্রয়োগ না করে কেবল ডেটা পড়তে হবে কিনা whether
  • timeout: একটি সময়সীমা ব্যতিক্রম না ছোঁড়া হওয়া পর্যন্ত লেনদেনের প্রসঙ্গটি কত সেকেন্ড চলতে দেওয়া উচিত?
  • valueবা transactionManager: TransactionManagerলেনদেন প্রসঙ্গে বাঁধাকালীন ব্যবহার করার জন্য বসন্ত শিমের নাম ।

জাভা ইই @Transactional

javax.transaction.Transactionalটীকা (2013 প্রায়) জাভা EE 7 স্পেসিফিকেশন দ্বারা যোগ করা হয়েছিল। সুতরাং, জাভা ইই টীকাগুলিটি 8 বছর পরে যুক্ত করা হয়েছিল যা এটির বসন্তের অংশ।

জাভা EE @Transactionalমাত্র 3 টি বৈশিষ্ট্য সংজ্ঞায়িত করেছে:

  • dontRollbackOn: জাভা Exceptionক্লাসগুলির তালিকা যা কোনও লেনদেন রোলব্যাকটি ট্রিগার না করে ট্রিগার করা যায়
  • rollbackOn: জাভা Exceptionক্লাসগুলির তালিকা যা নিক্ষেপ করার সময় একটি লেনদেন রোলব্যাককে ট্রিগার করে
  • value: TxTypeএনাম দ্বারা প্রদত্ত প্রচারের কৌশল । উদাহরণস্বরূপ, যদি লেনদেনের প্রসঙ্গটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে (যেমন, REQUIRED) বা একটি নতুন লেনদেনের প্রসঙ্গ তৈরি করা উচিত (উদাহরণস্বরূপ REQUIRES_NEW) বা কোনও ব্যতিক্রম নিক্ষেপ করা উচিত যদি কোনও লেনদেনের প্রসঙ্গ উপস্থিত না থাকে (যেমন, MANDATORY) বা যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া উচিত যদি কোনও বর্তমান লেনদেনের প্রসঙ্গ পাওয়া যায় (যেমন, NOT_SUPPORTED)।

কোনটি বেছে নেবে?

আপনি যদি স্প্রিং বা স্প্রিং বুট ব্যবহার করেন তবে স্প্রিং @Transactionalটীকাটি ব্যবহার করুন , কারণ এটি আপনাকে জাভা ই ই @Transactionalটিক চিহ্নের চেয়ে আরও বেশি বৈশিষ্ট্যগুলি কনফিগার করতে দেয় ।

আপনি যদি একা জাভা ইই ব্যবহার করে থাকেন এবং আপনি নিজের অ্যাপ্লিকেশনটি জাভা ইই অ্যাপ্লিকেশন সার্ভারে স্থাপন করেন, তবে জাভা ইই Trans। @ ট্রানজেকশনাল টিকাটি ব্যবহার করুন।

স্প্রিং বা জাভা ইই @Transactionalসংজ্ঞাগুলি ব্যবহার করার সময় বিচ্ছিন্ন স্তরের কনফিগারেশনটি কীভাবে পৃথক হয় সে সম্পর্কে আরও তথ্যের জন্য , এই নিবন্ধটি দেখুন

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