আশাবাদী লকিং কাজ না করলে আমার কী করা উচিত?


11

আমার এই নিম্নলিখিত পরিস্থিতি রয়েছে:

  1. একজন ব্যবহারকারী একটি জিইটি অনুরোধ করে /projects/1এবং একটি ইট্যাগ গ্রহণ করে ।
  2. ব্যবহারকারী একটি তোলে PUT করার অনুরোধ /projects/1# 1 টি পদক্ষেপ থেকে ETag সঙ্গে।
  3. ব্যবহারকারীর /projects/1পদক্ষেপ # 1 থেকে ইটাগের সাথে অন্য PUT অনুরোধ জানায় ।

সাধারণত, দ্বিতীয় PUT অনুরোধটি 412 প্রতিক্রিয়া পাবে, যেহেতু ETag এখন বাসি - প্রথম পুট অনুরোধটি রিসোর্সটি সংশোধন করেছে, তাই ইটিগ আর মেলে না।

তবে যদি দুটি পিটি অনুরোধ একই সাথে (বা অন্য একের পর এক) প্রেরণ করা হয়? প্রথম পুট অনুরোধে PUT # 2 আসার পূর্বে উত্সটি প্রক্রিয়া করার এবং আপডেট করার সময় নেই, যার ফলে PUT # 2 PUT # 1 ওভাররাইট করে। আশাবাদী লকিংয়ের পুরো বিষয়টি হ'ল এটি না হওয়ার জন্য ...


3
ব্যবসায়িক স্তরের লেনদেনে আপনার অপারেশনগুলিকে অ্যাটমাইজ করুন, যেমন এসবেন নীচে ব্যাখ্যা করেছেন।
রবার্ট হার্ভে

আমি যদি লেনদেন ব্যবহার করে আমার ক্রিয়াকলাপগুলিকে অ্যাটমাইজ করি তবে কী হবে? PUT # 1 সম্পূর্ণ প্রক্রিয়া না করা অবধি প্রক্রিয়া করা হবে না?
ম্যাক্সিমিডেপ্রে

7
হতাশ হয়ে গেলেন?
jpmc26

ভাল এটি লকিং জন্য যা।
ফ্যাটি

সঠিক, অবশ্যই # 2- এ প্রক্রিয়া করা উচিত নয় - এগুলি অনন্য বলে মনে করা হচ্ছে।
ফ্যাটি

উত্তর:


21

ইটাগ প্রক্রিয়াটি আশাবাদী লক করার জন্য কেবল যোগাযোগ প্রোটোকল নির্দিষ্ট করে। আশাবাদী লকটি প্রয়োগের জন্য সমবর্তী আপডেটগুলি সনাক্ত করার প্রক্রিয়াটি প্রয়োগ করা অ্যাপ্লিকেশন পরিষেবার দায়িত্ব of

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


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

1
@ ম্যাক্সিমিডেপ্রে: আপনি যদি লেনদেন ব্যবহার করে থাকেন তবে আপনার কিছু ধরণের লক রয়েছে, যদিও এটি অন্তর্নিহিত লকস (লকগুলি স্বয়ংক্রিয়ভাবে অর্জিত হয় যখন আপনি স্পষ্টভাবে অনুরোধ করার পরিবর্তে ক্ষেত্রগুলি পড়বেন / আপডেট করবেন)। আমি উপরে বর্ণিত প্রক্রিয়াটি কেবল সেইগুলি অন্তর্ভুক্ত লকিং ব্যবহার করে প্রয়োগ করা যেতে পারে। আপনার অন্যান্য প্রশ্ন হিসাবে, এটি আপনি যে ডাটাবেসটি ব্যবহার করছেন তার উপর নির্ভর করে তবে অনেকগুলি আধুনিক ডাটাবেসগুলি একাধিক পাঠক এবং লেখককে অপ্রয়োজনীয়ভাবে একে অপরকে অবরুদ্ধ না করে একই ক্ষেত্রগুলিতে কাজ করার অনুমতি দেওয়ার জন্য এমভিসিসি (মাল্টি সংস্করণ সহকারী নিয়ন্ত্রণ) ব্যবহার করে।
মিথ্যা রায়ান

1
সতর্কতা: অনেকগুলি ডিবিএমএসে (পোস্টগ্রাইএসকিউএল, ওরাকল, এসকিউএল সার্ভার, ইত্যাদি), ডিফল্ট লেনদেনের বিচ্ছিন্নতা স্তরটি "পড়ুন প্রতিশ্রুতিবদ্ধ", যেখানে ওপির রেস অবস্থার প্রতিরোধ করার জন্য আপনার দৃষ্টিভঙ্গি যথেষ্ট নয় । এই জাতীয় ডিএমবিএসে আপনি AND ETag = ...আপনার UPDATEবিবৃতিটির ধারাটিতে অন্তর্ভুক্ত করে WHEREএবং আপডেট-সারি-গণনাটি পরে পরীক্ষা করে এটি ঠিক করতে পারেন । (বা একটি কঠোর লেনদেনের বিচ্ছিন্নতা স্তর ব্যবহার করে, তবে আমি সত্যিই
এটির

1
@রুখ: এটি আপনি কীভাবে আপনার ক্যোয়ারী লেখেন তার উপর নির্ভর করে, হ্যাঁ ডিফল্ট বিচ্ছিন্নতা স্তরটি সমস্ত প্রশ্নের জন্য স্বয়ংক্রিয়ভাবে এ জাতীয় আচরণ প্রদান করে না, তবে আপনার লেনদেনটি এমনভাবে গঠন করা সম্ভব যে আশাবাদী লকিং বাস্তবায়নের পক্ষে যথেষ্ট হবে। বেশিরভাগ ক্ষেত্রে, যদি লেনদেনের ধারাবাহিকতা অ্যাপ্লিকেশনটিতে গুরুত্বপূর্ণ হয়, আমি যাইহোক, ডিফল্ট বিচ্ছিন্নতা স্তর হিসাবে পুনরাবৃত্তিযোগ্য পড়ার পরামর্শ দেব; এমভিসিসি ব্যবহার করে এমন ডেটাবেজে, পুনরাবৃত্তিযোগ্য পঠনের ওভারহেড মোটামুটি ন্যূনতম এবং এটি উল্লেখযোগ্যভাবে অ্যাপ্লিকেশনটিকে সহজতর করে।
মিথ্যা রায়ান

1
@রুখ: পুনরাবৃত্তিযোগ্য পঠনের মূল অপূর্ণতা হ'ল সামনের লেনদেন হলে আপনাকে আবার চেষ্টা করতে বা ব্যর্থ হওয়ার জন্য প্রস্তুত থাকতে হবে। এটি সাধারণত একটি সমস্যা, তবে যে অ্যাপ্লিকেশনগুলি সম্মতিসূচক কৌশল হিসাবে আশাবাদী লক সরবরাহ করে তা ইতিমধ্যে যেভাবেই হ্যান্ডলিংয়ের প্রয়োজন হবে, সুতরাং পুনরাবৃত্তযোগ্য পড়া ব্যর্থতাগুলি প্রাকৃতিকভাবে আশাবাদী লকিং ব্যর্থতার মানচিত্র এবং এটি আসলে নতুন ত্রুটিগুলি যুক্ত করবে না।
মিথ্যা রায়ান

13

আপনাকে নিম্নোক্ত জোড়কে পরমাণুভাবে সম্পাদন করতে হবে:

  • বৈধতার জন্য ট্যাগ পরীক্ষা করা (উদাহরণস্বরূপ আপ টু ডেট)
  • রিসোর্স আপডেট করা (যার মধ্যে ট্যাগটি আপডেট করা অন্তর্ভুক্ত)

অন্যরা এটিকে লেনদেন বলছেন - তবে মৌলিকভাবে এই দুটি অপারেশনের পারমাণবিক সম্পাদন হ'ল সময়কে দুর্ঘটনাক্রমে একজন অপরটিকে ওভাররাইট করা থেকে বাধা দেয়; এটি ছাড়া আপনার প্রতিযোগিতার অবস্থা রয়েছে, যেমনটি আপনি লক্ষ করছেন।

এটি এখনও আশাবাদী লক হিসাবে বিবেচিত হয়, যদি আপনি বড় ছবিটি দেখেন: যে কোনও ব্যবহারকারী বা ডেটা দেখছেন এমন কোনও ব্যবহারকারী দ্বারা প্রাথমিক রিড (জিইটি) দ্বারা সংস্থানটি নিজেই লক করা হয়নি, আপডেট করার ইচ্ছায় হোক বা না হোক।

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

এই দুটি অপারেশনের পরমাণু সম্পাদন অর্জনের অনেকগুলি উপায়ও রয়েছে - সংস্থানটি লক করা একমাত্র বিকল্প নয়; উদাহরণস্বরূপ, একটি হালকা ওজনের থ্রেড বা অবজেক্ট লকটি পর্যাপ্ত হতে পারে এবং আপনার অ্যাপ্লিকেশনটির আর্কিটেকচার এবং সম্পাদন প্রসঙ্গে নির্ভর করে।


4
এটি গুরুত্বপূর্ণ যে পারমাণবিক হচ্ছে তা লক্ষ করার জন্য +1। অন্তর্নিহিত উত্স আপডেট করা হচ্ছে তার উপর নির্ভর করে লেনদেন বা লকিং ছাড়াই এটি সম্পন্ন করা যায়। উদাহরণস্বরূপ, একটি মেমরির রিসোর্সের পরমাণু তুলনা এবং অদলবদল, বা অজানা ডেটা ইভেন্ট-সোর্সিং।
হারুন এম। ইশবাখ

@ অ্যারোনএম.এশবাখ সম্মত হয়েছেন এবং তাদের আহ্বান করার জন্য ধন্যবাদ।
এরিক tদ

1

এটি অ্যাপ্লিকেশন বিকাশকারীকে আসলে ই-ট্যাগটি পরীক্ষা করতে এবং সেই যুক্তি সরবরাহ করতে পারে। ওয়েব সার্ভারটি আপনার পক্ষে করে এমন কোনও জাদু নয় কারণ এটি কেবল E-Tagস্থির সামগ্রীর জন্য শিরোনামগুলি কীভাবে গণনা করতে হয় তা জানে । সুতরাং আসুন উপরে আপনার পরিস্থিতি গ্রহণ করুন এবং মিথস্ক্রিয়াটি কীভাবে হওয়া উচিত তা ভেঙে দিন।

GET /projects/1

সার্ভারটি অনুরোধটি গ্রহণ করে, রেকর্ডের এই সংস্করণটির জন্য ই-ট্যাগ নির্ধারণ করে, আসল সামগ্রী সহ এটি ফিরিয়ে দেয়।

200 - OK
E-Tag: "412"
Content-Type: application/json
{modified: false}

যেহেতু ক্লায়েন্টের এখন ই-ট্যাগ মান রয়েছে, এটি এটি PUTঅনুরোধ সহ অন্তর্ভুক্ত করতে পারে :

PUT /projects/1
If-Match: "412"
Content-Type: application/json
{modified: true}

এই মুহুর্তে আপনার অ্যাপ্লিকেশনটি নিম্নলিখিত কাজগুলি করতে হবে:

  • যাচাই করে নিন যে ই-ট্যাগ এখনও সঠিক: "412" == "412"?
  • যদি তা হয় তবে আপডেট করুন এবং একটি নতুন ই-ট্যাগ গণনা করুন

সাফল্যের প্রতিক্রিয়া পাঠান।

204 No Content
E-Tag: "543"

যদি অন্য কোনও অনুরোধ আসে এবং PUTউপরের অনুরোধটির অনুরূপ সম্পাদন করার চেষ্টা করে , আপনার সার্ভার কোডটি দ্বিতীয়বার এটি মূল্যায়ন করে, আপনি ত্রুটি বার্তা সরবরাহ করার জন্য দায়বদ্ধ।

  • ই-ট্যাগটি যাচাই করা এখনও সঠিক: "412"! = "543"

ব্যর্থতায়, ব্যর্থতার প্রতিক্রিয়া পাঠান।

412 Precondition Failed

এটি আপনাকে কোড লিখতে হবে। ই-ট্যাগ আসলে কোনও পাঠ্য হতে পারে (এইচটিটিপি অনুচ্ছেদে সীমাবদ্ধতার মধ্যে) within এটি একটি নম্বর হতে হবে না। এটি পাশাপাশি একটি হ্যাশ মান হতে পারে।


আপনি এখানে ব্যবহার করছেন এটি কোনও স্ট্যান্ডার্ড HTTP স্বরলিপি নয়। স্ট্যান্ডার্ড কমপ্লায়েন্ট এইচটিটিপিতে, আপনি কেবল প্রতিক্রিয়া শিরোনামে ইটাগ ব্যবহার করেন। আপনি কখনই একটি অনুরোধ শিরোনামে ইটাগ প্রেরণ করবেন না, তবে এর পরিবর্তে অনুরোধ শিরোনামগুলিতে একটি ইফ-ম্যাচ বা যদি-কিছুই নয়-ম্যাচ শিরোনামে পূর্ববর্তী অর্জিত ইটাগ মানটি ব্যবহার করুন।
মিথ্যা রায়ান

-2

অন্যান্য উত্তরের পরিপূরক হিসাবে, আমি জিরোমকিউ ডকুমেন্টেশনের সেরা উদ্ধৃতিগুলির একটি পোস্ট করব যা অন্তর্নিহিত সমস্যাটির বিশ্বস্ততার সাথে বর্ণনা করে:

পুরোপুরি নিখুঁত এমটি প্রোগ্রামগুলি তৈরি করতে (এবং আমি বলতে চাই যে আক্ষরিক অর্থে) জিরোমিকিউ সকেটগুলিতে প্রেরিত বার্তাগুলি ব্যতীত আমাদের মুটেক্স, লক বা আন্তঃ-থ্রেড যোগাযোগের অন্য কোনও প্রকারের দরকার নেই।

"পারফেক্ট এমটি প্রোগ্রামগুলি" দ্বারা, আমার অর্থ কোড লিখতে ও বুঝতে সহজ, এটি যে কোনও প্রোগ্রামিং ভাষায় এবং যে কোনও অপারেটিং সিস্টেমে একই নকশার পদ্ধতির সাথে কাজ করে এবং শূন্যের অপেক্ষার স্থিতির কোনও সংখ্যক সিপিইউ জুড়ে স্কেল করে এবং কোনও বিন্দু নেই হ্রাসকারী রিটার্নের।

আপনি যদি আপনার এমটি কোডটি একেবারে কার্যকর করার জন্য কৌশলগুলি শেখার জন্য কয়েক বছর অতিবাহিত করেছেন, তবে তালা এবং সেমোফোর এবং সমালোচনামূলক বিভাগগুলি সহ দ্রুত ছেড়ে দিন, আপনি যখন বুঝতে পারবেন যে এটি কিছুই ছিল না তখনই আপনি বিরক্ত হবেন। যদি আমরা 30+ বছরের সমবর্তী প্রোগ্রামিং থেকে একটি পাঠ শিখি তবে তা হয়: কেবল রাষ্ট্র ভাগ করে নেবেন না। এটি দুটি মাতাল লোকের মতো একটি বিয়ার ভাগ করে নেওয়ার চেষ্টা করছে। তারা ভাল বন্ধু হ'ল কিছু যায় আসে না। যত তাড়াতাড়ি বা পরে, তারা লড়াইয়ে নামতে চলেছে। এবং আপনি টেবিলে যত মাতাল করেন, তারা বিয়ারের উপরে একে অপরের সাথে লড়াই করে। এমটি অ্যাপ্লিকেশনগুলির মর্মান্তিক সংখ্যাগরিষ্ঠগুলি মাতাল বারের লড়াইয়ের মতো দেখাচ্ছে।

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