টেবিলের লকগুলির সাথে লেনদেনের বিচ্ছিন্নতার স্তরের সম্পর্ক


105

আমি বিচ্ছিন্নতার প্রায় 4 টি স্তর পড়েছি:

Isolation Level       Dirty Read    Nonrepeatable Read  Phantom Read  
READ UNCOMMITTED      Permitted       Permitted           Permitted
READ COMMITTED              --        Permitted           Permitted
REPEATABLE READ             --             --             Permitted
SERIALIZABLE                --             --              --

আমি লক বুঝতে চাইছি প্রতিটি লেনদেনের বিচ্ছিন্নতা টেবিলের সাথে থাকে

READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)

নীচে তিনটি ঘটনা ঘটেছে যা লেনদেনের বিচ্ছিন্নতায় ঘটতে পারে
ডার্টি রিড - কোনও লক
ননরপঠনযোগ্য পড়ুন না - প্রতিশ্রুতিযুক্ত ডেটাতে লক হিসাবে কোনও নোংরা পড়া নেই
ফ্যান্টম রিড - এসকিএল-এর ব্লকে লক করা (যা নির্বাচিত প্রশ্ন ব্যবহার করে নির্বাচিত হয়)

আমি বুঝতে চাই আমরা কোথায় এই বিচ্ছিন্নতা স্তরগুলি সংজ্ঞায়িত করি: কেবল জেডিবিসি / হাইবারনেট স্তরে বা ডিবিতেও

PS: আমি ওরাকলে বিচ্ছিন্নতার স্তরের লিঙ্কগুলি পেরিয়েছি , তবে তারা আনাড়ি মনে হয় এবং নির্দিষ্ট ডাটাবেসে কথা বলে


3
এটি সম্পূর্ণভাবে ডাটাবেসের উপর নির্ভর করে। বিচ্ছিন্নতা স্তরের জন্য বিভিন্ন ডাটাবেস বিভিন্ন অ্যালগরিদম ব্যবহার করতে পারে। কেউ এমভিসিসি ব্যবহার করতে পারেন (নির্বাচিত অনুসন্ধানগুলিতে কোনও লক নেই), কেউ কঠোর 2 ফেজ লকিং (ভাগ এবং একচেটিয়া লক) ব্যবহার করতে পারেন।
brb চা

উত্তর:


157

আমি লক বুঝতে চাইছি প্রতিটি লেনদেনের বিচ্ছিন্নতা টেবিলের সাথে থাকে

উদাহরণস্বরূপ, আপনার কাছে 3, এক এবং বি সি সমন্বিত প্রক্রিয়া রয়েছে একটি লেনদেন শুরু করে, ডেটা লিখে এবং কমিট / রোলব্যাক (ফলাফলের উপর নির্ভর করে)। বি কেবল SELECTডেটা পড়ার জন্য একটি বিবৃতি কার্যকর করে। সি তথ্য পড়েন এবং আপডেট করেন। এই সমস্ত প্রক্রিয়া একই টেবিল টিতে কাজ করে T

  • অননুমোদিত পড়ুন - টেবিলটিতে কোনও লক নেই। আপনি লেখার সময় টেবিলে ডেটা পড়তে পারেন। এর অর্থ হ'ল এ লেখার ডেটা (অনির্দিষ্ট) এবং বি এই অনিয়মিত ডেটা পড়তে এবং এটি (যে কোনও উদ্দেশ্যে) ব্যবহার করতে পারে। যদি ক একটি রোলব্যাক কার্যকর করে, বি এখনও ডেটা পড়ে এবং ব্যবহার করেছে। এটি ডেটার সাথে কাজ করার দ্রুততম তবে সবচেয়ে সুরক্ষিত উপায় যেহেতু শারীরিকভাবে সম্পর্কিত নয় এমন টেবিলগুলিতে ডেটা হোলের কারণ হতে পারে (হ্যাঁ, দুটি টেবিল যুক্তিযুক্তভাবে হতে পারে তবে বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলিতে শারীরিকভাবে সম্পর্কিত নয় = \)।
  • কমিট পড়া - প্রতিশ্রুতিবদ্ধ ডেটা লক করুন। আপনি কেবল প্রতিশ্রুতিবদ্ধ ডেটা পড়তে পারেন। এর অর্থ হ'ল এ ডেটা লেখেন এবং বি কোনও প্রতিশ্রুতি কার্যকর না করা অবধি বি দ্বারা সংরক্ষণ করা ডেটা পড়তে পারে না। এখানে সমস্যাটি হ'ল সি বি এবং বি ক্লায়েন্টে পড়া এবং ব্যবহৃত ডেটা আপডেট করতে পারে তবে আপডেট হওয়া ডেটা থাকবে না।
  • পুনঃপঠনযোগ্য পড়ুন - এসকিউএল-এর একটি ব্লকে লক করুন (যা নির্বাচিত জিজ্ঞাসা ব্যবহার করে নির্বাচিত হয়)। এর অর্থ বি কোনও শর্তের অধীনে ডেটা পড়েন অর্থাত্ WHERE aField > 10 AND aField < 20, এ একটি তথ্য সন্নিবেশ করায় যেখানে aFieldমান 10 এবং 20 এর মধ্যে হয়, তারপরে বি আবার ডেটা পড়ে এবং আলাদা ফলাফল পায়।
  • গুরুতর - একটি পূর্ণ টেবিল লক (যার উপর নির্বাচন জিজ্ঞাসা নিক্ষেপ করা হয়)। এর অর্থ, বি ডেটা পড়ে এবং অন্য কোনও লেনদেন টেবিলে থাকা ডেটা সংশোধন করতে পারে না । এটি ডেটা দিয়ে কাজ করার সর্বাধিক সুরক্ষিত তবে ধীরতম উপায়। এছাড়াও, যেহেতু একটি সাধারণ পঠন অপারেশন টেবিলটিকে লক করে রাখে , এটি উত্পাদনে ভারী সমস্যার সৃষ্টি করতে পারে: কল্পনা করুন যে টি টেবিলটি একটি চালান টেবিল, ব্যবহারকারী এক্স দিনের চালানগুলি জানতে চান এবং ব্যবহারকারী ওয়াই একটি নতুন চালান তৈরি করতে চান, তাই এক্স চালানগুলির পঠন সম্পাদন করার সময়, Y একটি নতুন চালান যুক্ত করতে পারবেন না (এবং এটি যখন অর্থ সম্পর্কে হয়, লোকেরা সত্যই পাগল হয়, বিশেষত কর্তারা)।

আমি বুঝতে চাই আমরা এই বিচ্ছিন্নতা স্তরগুলি কোথায় সংজ্ঞায়িত করি: কেবল জেডিবিসি / হাইবারনেট স্তরে বা ডিবিতেও

জেডিবিসি ব্যবহার করে আপনি এটি ব্যবহার করে সংজ্ঞা দিন Connection#setTransactionIsolation

হাইবারনেট ব্যবহার:

<property name="hibernate.connection.isolation">2</property>

কোথায়

  • 1: পড়াশুনাবিহীন
  • 2: কমিট পড়ুন
  • 4: পুনরাবৃত্তি পড়ুন
  • 8: গুরুতর

হাইবারনেট কনফিগারেশনটি এখান থেকে নেওয়া হয়েছে (দুঃখিত, এটি স্প্যানিশ ভাষায়)।

যাইহোক, আপনি আরডিবিএমএসেও বিচ্ছিন্নতা স্তরটি সেট করতে পারেন:

হতেই লাগলো...


docs.oracle.com/cd/B12037_01/server.101/b10743/consist.htm কেবল ওরাকল যুক্ত করার জন্য: একটি লেনদেনের শুরুতে এই বিবৃতিগুলির একটি ব্যবহার করে একটি লেনদেনের বিচ্ছিন্নতা স্তর নির্ধারণ করতে পারে: ট্রান্সঅ্যাকশন বিচ্ছিন্নতা সেট করুন স্তর পড়ুন কমিটি; ট্রানসেকশন বিচ্ছিন্নতা স্তর স্তর নির্ধারণ করুন; সেট ট্রানসেকশন কেবলমাত্র পড়ুন;
লার্নার

2
তদ্ব্যতীত, প্রতিটি ট্রানজেকশন SET ট্রান্সঅ্যাকশন স্টেটমেন্টের মাধ্যমে নেটওয়ার্কিং এবং প্রসেসিংয়ের ব্যয় সাশ্রয় করার জন্য, আপনি পরবর্তী সমস্ত লেনদেনের জন্য লেনদেনের বিচ্ছিন্নতা স্তর নির্ধারণের জন্য অলটার সেশন স্টেটমেন্টটি ব্যবহার করতে পারেন: ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE; ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
লার্নার

12
পুনঃপঠনযোগ্য পড়ুন সম্পর্কিত - আমি মনে করি এটি নিখরচায় আরও ভাল উদাহরণ দেখাবে: বি একটি লেনদেন শুরু করে, বর্গের ব্লকের ডেটা পড়ুন যেখানে এফিল্ড> 10 এবং এফিল্ড <20, লেনদেন শেষ না হওয়া অবধি ডেটা লক হয়ে যায়। একটি ডেটা আপডেট করার চেষ্টা করে তবে লক হওয়ার কারণে অপেক্ষা করে। এখন যখন বি সেই একই লেনদেনে আবার সেই ডেটা পড়বে তখন এটি একই ডেটা পড়ার গ্যারান্টিযুক্ত, কারণ এটি লক হয়েছে। আমি ভুল হলে শুধরে.
বার্নটোকোড

1
@LuiggiMendoza সাধারণ ধারণা হিসেবে বিচ্ছিন্নতা মাত্রা প্রায় হয় ডার্টি পড়ুন , অ repeatable পড়ুন এবং ফ্যান্টম সারি । লকস (এস 2 পিএল) বা এমভিসিসি বিভিন্ন বিক্রেতার জন্য বাস্তবায়ন।
brb চা

4
@ লুইগিগেনডোজা - আমি সঠিক ছিলাম না, এটি এমন হওয়া উচিত - বি যে ডেটা পড়েছে তা পরিবর্তিত হয় না, তবে বি দ্বারা তৈরি ফলাফলগুলি আরও সারি ফিরে আসতে পারে। এটি কারণ এ যে এগুলি তাদের প্রকাশ না করা অবধি বি ইতিমধ্যে পঠিত সারিগুলিকে সংশোধন করতে পারে না । তবে এ নতুন সারিগুলি সন্নিবেশ করতে পারে যা শর্তটি যোগ্য করে তোলে (এবং তাই পরবর্তী সময় এ একটি নির্বাচন সম্পাদন করবে এটি আরও সারিগুলির সাথে একটি পৃথক ফলাফল পাবে - একটি ফ্যান্টম রিড)।
বোর্নটোকোড

9

যেমন বিআরবি চা বলেছেন, ডাটাবেস বাস্তবায়ন এবং তারা যে অ্যালগরিদম ব্যবহার করেন তার উপর নির্ভর করে: এমভিসিসি বা টু ফেজ লকিং।

কিউবিআরডি (ওপেন সোর্স আরডিবিএমএস) এই দুটি অ্যালগরিদমের ধারণাটি ব্যাখ্যা করে:

  • দ্বি-ফেজ লকিং (2PL)

প্রথমটি হ'ল টি 2 লেনদেন যখন এ রেকর্ডটি পরিবর্তন করার চেষ্টা করে, তখন তা জানে যে টি 1 লেনদেন ইতিমধ্যে A রেকর্ড পরিবর্তন করেছে এবং টি 1 লেনদেন সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করে কারণ টি 2 লেনদেনটি টি 1 লেনদেনটি কমিট বা রোলড হবে কিনা তা জানতে পারে না পেছনে. এই পদ্ধতিটিকে টু-ফেজ লকিং (2PL) বলা হয়।

  • একাধিক সংস্করণ সম্মতি নিয়ন্ত্রণ (এমভিসিসি)

অন্যটি হ'ল তাদের প্রত্যেকের টি 1 এবং টি 2 লেনদেনের নিজস্ব পরিবর্তিত সংস্করণ থাকতে দেওয়া। এমনকি যখন টি 1 লেনদেনটি A থেকে 1 রেকর্ড পরিবর্তন করেছে, তখনও টি 1 লেনদেনটি মূল মান 1টিকে যেমনটি ছেড়ে যায় এবং লিখেছেন যে A রেকর্ডের টি 1 লেনদেনের সংস্করণ 2, তারপরে, নীচের টি 2 লেনদেনটি একটি রেকর্ড পরিবর্তন করে 1 থেকে 3 পর্যন্ত, 2 থেকে 4 পর্যন্ত নয় এবং লিখেছেন যে A রেকর্ডের টি 2 লেনদেনের সংস্করণ 3।

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

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

2PL তে লেনদেনের বিচ্ছিন্নতার স্তরগুলি নিম্নলিখিতগুলি নিয়ন্ত্রণ করে :

  • ডেটা পড়ার সময় লক নেওয়া হয় কিনা এবং কী ধরণের লকগুলির অনুরোধ করা হয় Whether

  • কতক্ষণ পঠিত তালা রাখা হয়।

  • কোনও পঠন অপারেশন রেফারেন্সিং সারিগুলি অন্য লেনদেন দ্বারা সংশোধিত হয়েছে কিনা:

    • সারিটির একচেটিয়া লকটি মুক্ত না হওয়া পর্যন্ত অবরুদ্ধ করুন।

    • বিবৃতি বা লেনদেন শুরু হওয়ার সময় বিদ্যমান সারিটির প্রতিশ্রুতিবদ্ধ সংস্করণটি পুনরুদ্ধার করুন।

    • অননুমোদিত ডেটা পরিবর্তনটি পড়ুন

লেনদেনের বিচ্ছিন্নতা স্তর নির্বাচন করা ডেটা পরিবর্তনগুলি রক্ষা করতে যে লকগুলি অর্জিত হয় তাদের উপর প্রভাব ফেলবে না। লেনদেনের জন্য বিচ্ছিন্নতা নির্ধারণের স্তর নির্বিশেষে কোনও লেনদেন সর্বদা যে কোনও ডেটা সংশোধন করে এবং লকটি ধরে রাখে সেটিতে এটি সর্বদা একচেটিয়া লক পায়। পাঠ্য ক্রিয়াকলাপগুলির জন্য, লেনদেনের বিচ্ছিন্নতা স্তরগুলি প্রাথমিকভাবে অন্যান্য লেনদেন দ্বারা সংশোধিত প্রভাবগুলির থেকে সুরক্ষা স্তরকে সংজ্ঞায়িত করে।

একটি নিম্ন বিচ্ছিন্নতা স্তর একই সাথে অনেক ব্যবহারকারীর ডেটা অ্যাক্সেস করার ক্ষমতা বাড়ায়, তবে ব্যবহারকারীদের মুখোমুখি হতে পারে এমন নোংরা পড়া বা হারিয়ে যাওয়া আপডেটের মতো সম্মতিযুক্ত প্রভাবগুলির সংখ্যা বৃদ্ধি করে

এসকিউএল সার্ভারে লক এবং বিচ্ছিন্নতা স্তরের মধ্যে সম্পর্কের কংক্রিট উদাহরণ (READ_COMMITTED_SNAPSHOT = চালু থাকলে READ_COMMITED ব্যতীত 2PL ব্যবহার করুন)

  • READ_UNCOMMITED: অন্যান্য লেনদেনকে বর্তমান লেনদেনের দ্বারা পড়া ডেটা পরিবর্তন করতে বাধা দেওয়ার জন্য ভাগ করা লকগুলি ইস্যু করবেন না। পড়ুন অনিক্মিত লেনদেনগুলি এমন একচেটিয়া লক দ্বারা অবরুদ্ধ করা হয়নি যা বর্তমান লেনদেনকে সারি সারি পাঠানো থেকে রোধ করতে পারে যা পরিবর্তিত হয়েছে তবে অন্যান্য লেনদেন দ্বারা প্রতিশ্রুতিবদ্ধ নয়। [...]

  • READ_COMMITED:

    • যদি READ_COMMITTED_SNAPSHOT OFF (ডিফল্ট) এ সেট করা থাকে: বর্তমান লেনদেনটি একটি পঠন ক্রিয়াকলাপ চলাকালীন অন্য লেনদেনকে সারি পরিবর্তন করতে বাধা দিতে ভাগ করা লকগুলি ব্যবহার করে। ভাগ করা লকগুলি অন্যান্য লেনদেন সম্পন্ন না হওয়া পর্যন্ত অন্যান্য লেনদেন দ্বারা সংশোধিত সারিগুলি পড়া স্টেটমেন্টটি অবরুদ্ধ করে। [...] পরবর্তী সারিতে প্রক্রিয়া করার আগে সারি লকগুলি প্রকাশ করা হয়। [...]
    • যদি READ_COMMITTED_SNAPSHOT চালু করা থাকে, ডেটাবেস ইঞ্জিন বিবৃতিটির শুরুতে বিদ্যমান হিসাবে ডেটা লেনদেনের সাথে সামঞ্জস্যপূর্ণ স্ন্যাপশট সহ প্রতিটি বিবৃতি উপস্থাপন করতে সারি সংস্করণ ব্যবহার করে। অন্যান্য লেনদেনের দ্বারা আপডেটগুলি থেকে ডেটা রক্ষা করতে লকগুলি ব্যবহার করা হয় না।
  • REPETEABLE_READ: লেনদেনে প্রতিটি বিবৃতি দ্বারা পঠিত সমস্ত ডেটাতে ভাগ করা লকগুলি রাখা হয় এবং লেনদেন সম্পূর্ণ না হওয়া পর্যন্ত ধরে রাখা হয়।

  • গুরুত্বপূর্ণ [...] লেনদেন শেষ না হওয়া পর্যন্ত ব্যাপ্তি লকগুলি ধরে রাখা হয়।


5

লকগুলি সর্বদা ডিবি স্তরে নেওয়া হয়: -

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

লকগুলি কীভাবে সেট করা হয় তা লেনদেনের বিচ্ছিন্নতা স্তরের দ্বারা নির্ধারিত হয়, যা একেবারে কঠোর অ্যাক্সেসের বিধি প্রয়োগকারী সমর্থনমূলক লেনদেনকে সমর্থন করে না থেকে শুরু করে।

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

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