কীভাবে কোনও ওয়েব অ্যাপ্লিকেশনে রেসের পরিস্থিতি প্রতিরোধ করবেন?


31

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

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

এটি লক্ষণীয় যে কন্ট্রোলার পদ্ধতিগুলি নিজের মধ্যে থ্রেড-নিরাপদ। সাধারণত তারা ডাটাবেস লেনদেন ব্যবহার করে, যা তাদের এই অর্থে সুরক্ষিত করে যে অ্যালিস এবং বব যদি একই মুহুর্তে সংরক্ষণের চেষ্টা করে তবে এটি দুর্নীতির কারণ হবে না। অ্যালিস বা বব থেকে তাদের ব্রাউজারে বাসি ডেটা থাকার থেকে দৌড়ের অবস্থা দেখা দেয়।

কীভাবে আমরা এই জাতীয় জাতি পরিস্থিতি রোধ করতে পারি? বিশেষত, আমি জানতে চাই:

  • কোন কৌশলগুলি ব্যবহার করা যেতে পারে? যেমন শেষ পরিবর্তনের সময় ট্র্যাক করা। প্রতিটি আগপাছ কি হয়.
  • একটি সহায়ক ব্যবহারকারীর অভিজ্ঞতা কি?
  • এই সুরক্ষাটি কোন ফ্রেমওয়ার্ক তৈরি করেছে?

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

@ কিলিয়ানফথ - আমি বিশেষত যা জানতে চাই তার সম্পর্কে আমি কিছু তথ্য যুক্ত করেছি
paj28

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

2
এফওয়াইআই, আপনার প্রশ্নে লক করার যে ফর্মটি উল্লেখ করেছেন তা " আশাবাদী সমঝোতা নিয়ন্ত্রণ " হিসাবে পরিচিত
তাহশ্রিকে

উত্তর:


17

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


এটি সবচেয়ে ব্যবহারিক পদ্ধতির মত শোনাচ্ছে। আপনি কি এমন কোনও ফ্রেমওয়ার্ক জানেন যা এটি বাস্তবায়ন করে? আমি মনে করি এই প্রকল্পের বৃহত্তম সমস্যাটি হ'ল একটি সাধারণ "সম্পাদনা বিরোধ" বার্তা ব্যবহারকারীদের হতাশ করবে, তবে চেঞ্জসেটগুলি (ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে) মার্জ করার চেষ্টা করা কঠিন is
পজ 28

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

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

1
ডেটাফ্লেক্সে "রিডার ()" নামে একটি ফাংশন ছিল যা আপনার বর্ণনা অনুযায়ী করে। পরবর্তী সংস্করণগুলিতে, এটি বহুগুণী পরিবেশে নিরাপদ ছিল। এবং, প্রকৃতপক্ষে, কাজ করার জন্য এইভাবে আন্তঃবিবাহিত আপডেটগুলি পাওয়ার একমাত্র উপায় ছিল।

তুমি কেমন SQL সার্ভারের সাথে এই কাজ করতে একটি উদাহরণ দিতে পারেন \?
ঠ --''''''--------- '' '' '' '' '' ''

10

আমি দুটি প্রধান উপায় দেখেছি:

  1. কোনও গোপন ইনপুটটিতে ব্যবহারের সম্পাদনা করা পৃষ্ঠার শেষ আপডেটের টাইমস্ট্যাম্প যুক্ত করুন। টাইমস্ট্যাম্প করার সময় বর্তমানের বিরুদ্ধে পরীক্ষা করা হয় এবং যদি এটি মেলে না তবে এটি অন্য কারও দ্বারা আপডেট করা হয়েছে এবং ত্রুটি ফিরে পেয়েছে।

    • প্রো: একাধিক ব্যবহারকারী পৃষ্ঠার বিভিন্ন অংশ সম্পাদনা করতে পারেন। ত্রুটি পৃষ্ঠাটি একটি পৃথক পৃষ্ঠায় নিয়ে যেতে পারে যেখানে দ্বিতীয় ব্যবহারকারী নতুন পৃষ্ঠায় তার পরিবর্তনগুলি মার্জ করতে পারে।

    • কন: বড় সহবর্তী সম্পাদনার সময় কখনও কখনও প্রচেষ্টার বড় অংশ অপচয় হয়।

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

    • প্রো: সম্পাদনা প্রচেষ্টা নষ্ট হয় না।

    • কন: অসাধু ব্যবহারকারী কোনও পৃষ্ঠা অনির্দিষ্টকালের জন্য লক করতে পারে। মেয়াদোত্তীর্ণ লকযুক্ত একটি পৃষ্ঠা এখনও প্রতিশ্রুতিবদ্ধ হতে পারে যদি না অন্যথায় ডিল করা হয় (কৌশল 1 ব্যবহার করে)


7

আশাবাদী কনকুরન્સી নিয়ন্ত্রণ ব্যবহার করুন ।

প্রশ্নের সারণিতে একটি সংস্করণ নম্বর বা সংস্করণ টাইমস্ট্যাম্প কলাম যুক্ত করুন (পূর্ণসংখ্যা সবচেয়ে নিরাপদ)।

ব্যবহারকারী 1 রেকর্ড পড়ে:

{id:1, status:unimportant, version:5}

ব্যবহারকারী 2 রেকর্ড পড়ে:

{id:1, status:unimportant, version:5}

ব্যবহারকারী 1 রেকর্ড সংরক্ষণ করে, এটি সংস্করণটিকে বাড়িয়ে তোলে:

save {id:1, status:important, version:5}
new value {id:1, status:important, version:6}

ব্যবহারকারী 2 তারা যে রেকর্ডটি পড়েছে সেগুলি সংরক্ষণ করার চেষ্টা করে:

save {id:1, status:unimportant, version:5}
ERROR

হাইবারনেট / জেপিএ @Versionটীকা সহ স্বয়ংক্রিয়ভাবে এটি করতে পারে

আপনার নিয়মিত পাঠের রেকর্ডের অবস্থা বজায় রাখতে হবে, সাধারণত সেশনে (এটি কোনও লুকানো ফর্মের পরিবর্তে নিরাপদ)।


ধন্যবাদ ... @ ভার্সন সম্পর্কে জানতে বিশেষভাবে সহায়ক একটি প্রশ্ন: অধিবেশনে কেন রাজ্য সংরক্ষণ করা নিরাপদ? সেক্ষেত্রে আমি চিন্তিত হব যে পিছনের বোতামটি ব্যবহার করে জিনিসগুলিকে বিভ্রান্ত করতে পারে।

সেশনটি কোনও লুকানো ফর্ম উপাদানের চেয়ে নিরাপদ কারণ ব্যবহারকারী সংস্করণটির মান পরিবর্তন করতে পারবেন না। যদি এটি উদ্বেগের বিষয় না হয় তবে সেশন সম্পর্কে অংশটি উপেক্ষা করুন
নীল ম্যাকগুইগান

এই কৌশলটিকে আশাবাদী অফলাইন লক বলা হয় এবং এটি এসকিউএএলএলচেমিতেও রয়েছে
paj28

@ পাজ 28 - এর জন্য যে লিঙ্কটি SQLAlchemyআশাবাদী অফলাইন লক সম্পর্কে কোনও বিষয় নির্দেশ করে না এবং আমি এটি ডক্সে খুঁজে পাচ্ছি না। আপনার কি আরও সহায়ক লিঙ্কটি রয়েছে বা সাধারণভাবে এসকিউএলএলচেমিতে লোক দেখানো হয়েছে?
ডোয়ান্ডারসন

@ ডন্ডারসন আমি সেই লিঙ্কটির সংস্করণ প্রতিরূপ বোঝাচ্ছি।
paj28

1

কিছু অবজেক্ট রিলেশনাল ম্যাপিং (ওআরএম) সিস্টেম ডেটাবেস থেকে লোড হওয়ার পরে কোনও বস্তুর কোন ক্ষেত্র পরিবর্তিত হয়েছে তা সনাক্ত করবে এবং কেবলমাত্র এই মানগুলি সেট করতে এসকিউএল আপডেট বিবৃতি তৈরি করবে। রেল অন রুবেলের জন্য অ্যাক্টিভেকর্ড এমন একটি ওআরএম।

নেট প্রভাবিত হয় যে ব্যবহারকারী ক্ষেত্রগুলি পরিবর্তন করেনি সেগুলি ডেটাবেসে প্রেরিত UPDATE কমান্ডের অন্তর্ভুক্ত নয়। একই সময়ে বিভিন্ন ক্ষেত্র আপডেট করা লোকেরা একে অপরের পরিবর্তনকে ওভাররাইট করে না।

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


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

1
@ পাজ 28 গ্রেগের উত্তরের মূল বিষয় হ'ল " ব্যবহারকারীরা পরিবর্তন করেনি এমন ক্ষেত্রগুলি "। অ্যালিস দাম পরিবর্তন করেনি, তাই ওআরএম ডাটাবেসে "দাম" মানটি সংরক্ষণ করার চেষ্টা করবে না।
রস প্যাটারসন

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

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

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