কেবল পঠনমূলক ক্রিয়াকলাপের জন্য আমার হাইবারনেটে কেন লেনদেনের প্রয়োজন?


106

কেবল পঠনমূলক ক্রিয়াকলাপের জন্য আমার হাইবারনেটে কেন লেনদেনের প্রয়োজন?

নিম্নলিখিত লেনদেন ডিবিতে একটি লক রাখে?

ডিবি থেকে আনার উদাহরণ কোড:

Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction?
//readonly operation here

tx.commit() // why tx.commit? I don't want to write anything

আমি কি এর session.close() পরিবর্তে ব্যবহার করতে পারি tx.commit()?


9
ডিবি নিজেই লেনদেনের প্রয়োজন। আপনি এখানে অটোকমিট মোড সম্পর্কে পড়তে পারেন: community.jboss.org/wiki/…
ভেশে গুরুং

@ ভেশগুরুং আমার ধারণা, আমাদের কেবল
রচনার

4
আপনি কি লিঙ্কটির "ডিবাঙ্কিং অটো-কমিট মিথগুলি" অংশটি পড়েছেন?
ভেশে গুরুং

উত্তর:


131

আপনার কেবল লেনদেনকে কেবল পঠনযোগ্য হিসাবে চিহ্নিত করার কারণ থাকতে পারে।

  1. পড়ার জন্য লেনদেনগুলি সত্যই অদ্ভুত লাগবে এবং প্রায়শই লোকেরা এই ক্ষেত্রে লেনদেনের জন্য পদ্ধতিগুলি চিহ্নিত করে না। তবে জেডিবিসি যেভাবেই লেনদেন তৈরি করতে পারে, autocommit=trueভিন্ন বিকল্পগুলি সুস্পষ্টভাবে সেট না করা থাকলে এটি কাজ করবে ।
  2. তবে আপনার পদ্ধতিটি ডাটাবেজে না লিখার কোনও গ্যারান্টি নেই। আপনি যদি পদ্ধতিটিকে চিহ্নিত করেন @Transactional(readonly=true), স্প্রিং জেডিবিসি লেনদেনকে কেবল-পঠন মোডে সেট করবে, সুতরাং আপনি এই লেনদেনের সুযোগে ডিবিতে লিখতে আসলেই সম্ভব কিনা তা আপনি ডিক্টেট করবেন । যদি আপনার আর্কিটেকচারটি অসুবিধাগ্রস্ত হয় এবং কিছু টিমের সদস্যরা যেখানে প্রত্যাশিত নয় এমন পরিবর্তনের ক্যোয়ারী বেছে নিতে বেছে নিতে পারেন, এই পতাকাটি আপনাকে সমস্যাযুক্ত জায়গায় নির্দেশ করবে।
  3. এছাড়াও কেবল পঠনযোগ্য লেনদেনগুলি ডিবি দ্বারা অনুকূলিত করা যায় তবে এটি অবশ্যই ডিবি নির্দিষ্ট। উদাহরণস্বরূপ, মাইএসকিউএল কেবল ইনোডিবিতে 5.6.4 সংস্করণ থেকে এর জন্য সমর্থন যুক্ত করেছে added
  4. আপনি যদি জেডিবিসি সরাসরি ব্যবহার না করে বরং একটি ওআরএম ব্যবহার করেন তবে সমস্যা হতে পারে। উদাহরণস্বরূপ হাইবারনেট সম্প্রদায়টি বলেছে যে লেনদেনের বাইরে কাজ করা অবিশ্বাস্য আচরণের কারণ হতে পারে। হায়বারনেট লেনদেন খুলবে কারণ এটি হ'ল এটি নিজেরাই বন্ধ করবে না, সুতরাং লেনদেন প্রতিশ্রুতিবদ্ধ না হওয়ার সাথে সংযোগটি পুলটিতে ফিরে আসবে। তাহলে কি হয়? জেডিবিসি নীরবতা বজায় রেখেছে, সুতরাং এটি বাস্তবায়ন নির্দিষ্ট (মাইএসকিউএল ব্যাক ট্রানজেকশনটি রোল করে, ওরাকল আফার তা স্বীকার করে)। এটি সংযোগ পুল স্তরেও কনফিগার করা যায় (উদাঃ সি 3 পি 0 আপনাকে ডিফল্টরূপে রোলব্যাক এ জাতীয় একটি বিকল্প দেয়)।
  5. হাইবারনেটের কথা যখন আসে তখন স্প্রিং ফ্ল্যাশমোডকে ম্যানুয়ালে সেট করে কেবল-পঠনযোগ্য লেনদেনের ক্ষেত্রে, যা অন্যান্য অপ্টিমাইজেশনের দিকে নিয়ে যায় যেমন নোংরা চেকের প্রয়োজন নেই।
  6. আপনি স্পষ্টভাবে লেনদেনের বিচ্ছিন্নতা স্তরটিকে ওভাররাইড করতে বা সেট করতে চাইতে পারেন। এই প্রভাবগুলি পড়ার-লেনদেনের পাশাপাশি যেহেতু আপনি আপত্তিহীন পরিবর্তনগুলি পড়তে বা পড়তে চান না, ভ্যান্ট রিডের সংস্পর্শে আসেন ইত্যাদি

সংক্ষেপে - আপনি উভয় পথে যেতে পারেন, তবে আপনার পরিণতি বুঝতে হবে।


জবাব দেওয়ার জন্য ধন্যবাদ। আমি হাইবারনেট ব্যবহার করছি (নেটিভ হাইবারনেট, জেপিএ নয়)। তবে হাইবারনেট আমাকে কোনও ডিবি অপারেশন করার আগে ট্রান্সক্রেশন শুরু করতে বাধ্য করে।আমি যদি এটি শুরু না করি তবে কোনও সক্রিয় ট্র্যাকস্কেশন নয় বলে ত্রুটি ছুঁড়ে মারতে পারি। , হ্যাঁ কিভাবে?
ব্যবহারকারী 93796

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

1
খুব ভালভাবে ব্যাখ্যা! মার্ক রিচার্ডসের আর একটি নিবন্ধ ট্রানজেকশনাল টিকা - আইবিএম / ডেভেলপ ওয়ার্কস / জাভা / লিবারি / জেটিসস 1 / ইন্ডেক্স এইচটিএমএল -তে কেবলমাত্র পঠনযোগ্য পতাকার ক্ষতিগুলি বেশ ভালভাবে ব্যাখ্যা করেছে
মহেশ

47

শারীরিক লেনদেনের প্রসঙ্গে সমস্ত ডাটাবেস বিবৃতি কার্যকর করা হয়, এমনকি যখন আমরা স্পষ্টভাবে লেনদেনের সীমানা ঘোষণা করি না (বিগিন / কমিট / রোলব্যাক)।

আপনি যদি লেনদেনের সীমানা স্পষ্টভাবে ঘোষণা না করেন তবে প্রতিটি বিবৃতি পৃথক লেনদেন ( autocommitমোড) এ কার্যকর করতে হবে । এটি এমনকি প্রতি বিবৃতিতে একটি সংযোগ খোলার এবং বন্ধ করতে পারে যদি না আপনার পরিবেশ সংযোগ-প্রতি-থ্রেড বাঁধাইয়ের সাথে ডিল করতে পারে।

পরিষেবাটি হিসাবে ঘোষণা করা @Transactionalআপনাকে পুরো লেনদেনের সময়কালের জন্য একটি সংযোগ দেয় এবং সমস্ত বিবৃতি সেই একক বিচ্ছিন্নতা সংযোগ ব্যবহার করবে। এটি প্রথম স্থানে সুস্পষ্ট লেনদেন না ব্যবহারের চেয়ে ভাল।

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

জেপিএ পড়ার ক্রিয়াকলাপে লেনদেন কার্যকর করে না। আপনি যদি কোনও লেনদেনের প্রসঙ্গে শুরু করতে ভুলে যান তবে কেবলমাত্র কোনও লেনদেনের জন্য প্রয়োজনীয় ব্যতিক্রম ছুঁড়ে লিখুন writes তবুও, কেবল পঠনযোগ্য লেনদেনের জন্যও লেনদেনের সীমানা ঘোষণা করা সর্বদা ভাল (বসন্তে @Transactionalআপনি কেবল পঠনযোগ্য লেনদেনকে চিহ্নিত করতে পারবেন, যার দুর্দান্ত কার্যকারিতা রয়েছে)


1
"... তারপরে প্রতিটি বিবৃতি পৃথক লেনদেনে কার্যকর করতে হবে"। ধারকটি স্বয়ংক্রিয়ভাবে ব্যাচ প্রসেসিং করে না ?
আরশ

ব্যাচ প্রসেসিং পরিবর্তনগুলির জন্য, ডেটা পড়ার জন্য নয়। এবং তবুও, জেপিএ এবং হাইবারনেট ব্যবহার করার সময় জেডিবিসি ব্যাচিং ডিফল্টরূপে সক্ষম হয় না।
ভ্লাদ মিহলসিয়া

1
ধন্যবাদ ভ্লাদ আমি আপনার কিছু নিবন্ধ পড়েছি। তারা সত্যিই দরকারী।
আরশ

এই স্ট্যাকওভারফ্লো.com/q/34797480/179850 আপনার স্বীকৃতিটিকে কিছুটা দ্বিধায়িত করে বলে মনে হচ্ছে যে কেবলমাত্র লেনদেনের পড়ার ফলে দুর্দান্ত পারফরম্যান্স সুবিধা রয়েছে। কমপক্ষে, হাইবারনেট প্রসঙ্গে এটি বলে মনে হয় না।
নিমাই

না, তা হয় না। এটি কেবল পঠনযোগ্য সেট করার বিষয়ে, যখন আমার স্ব-প্রতিশ্রুতি এড়ানো সম্পর্কে।
ভ্লাদ মিহালসিয়া

17

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

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


14

আপনি কেবল পঠন করেছেন কিনা তা বিবেচনাধীন নয় - ডাটাবেসটিকে অবশ্যই আপনার ফলাফলের সন্ধান করতে হবে, কারণ অন্যান্য ডাটাবেস ক্লায়েন্ট এমন ডেটা লিখতে চাইতে পারে যা আপনার রেজাল্টটি পরিবর্তন করতে পারে।

আমি বিশাল ডাটাবেস সিস্টেমকে মেরে ফেলতে ত্রুটিযুক্ত প্রোগ্রামগুলি দেখেছি, কারণ তারা কেবল ডেটা পড়ে, কিন্তু কখনও প্রতিশ্রুতি দেয় না, লেনদেনের লগকে বাড়তে বাধ্য করে, কারণ ডিবি কোনও কমিট বা রোলব্যাকের আগে লেনদেনের তথ্য প্রকাশ করতে পারে না, এমনকি ক্লায়েন্ট কিছুই না করলেও ঘন্টাখানেকের জন্য.

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