ডিডিডির সাথে লেনদেনের ধারাবাহিকতা নিশ্চিত করা


9

আমি ডিডিডি দিয়ে শুরু করছি এবং বুঝতে পারি যে ট্রান্সন্যাশনাল ধারাবাহিকতা নিশ্চিত করতে সামগ্রিক শিকড়গুলি ব্যবহৃত হয়। আমাদের একটি অ্যাপ্লিকেশন পরিষেবাতে একাধিক সংস্থাগুলি পরিবর্তন করা উচিত নয়।

নিম্নলিখিত পরিস্থিতিটি কীভাবে মোকাবেলা করতে হবে তা জানতে চাই।

আমার কাছে পণ্য নামে একটি সামগ্রিক মূল রয়েছে।

গ্রুপ নামে একটি সামগ্রিক মূলও রয়েছে।

উভয়ের আইডির রয়েছে এবং এটি স্বাধীনভাবে সম্পাদনা করা যেতে পারে।

একাধিক পণ্য একই গ্রুপের দিকে নির্দেশ করতে পারে।

আমার কাছে একটি অ্যাপ্লিকেশন পরিষেবা রয়েছে যা একটি পণ্যের গ্রুপ পরিবর্তন করতে পারে:

ProductService.ChangeProductGroup(string productId, string groupId)

  1. চেক গ্রুপ বিদ্যমান
  2. সংগ্রহস্থল থেকে পণ্য পান
  3. এর গ্রুপ সেট করুন
  4. পণ্যটি পুনরায় সংগ্রহস্থলে লিখুন

আমার কাছে একটি অ্যাপ্লিকেশন পরিষেবা রয়েছে যেখানে গ্রুপটি মোছা যেতে পারে:

GroupService.DeleteGroup(string groupId) 1. সংগ্রহস্থল থেকে পণ্যগুলি পান যার গ্রুপআইড সরবরাহ করা গ্রুপআইডে সেট করা আছে, গণনা 0 বা গর্ভপাত বাতিল হওয়া নিশ্চিত করুন 2. গোষ্ঠী সংগ্রহস্থল থেকে গোষ্ঠী মুছুন 3. পরিবর্তনগুলি সংরক্ষণ করুন

আমার প্রশ্নটি নিম্নলিখিত পরিস্থিতিটি হ'ল, তবে কি হবে:

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

এটি কি আমার ডিজাইনের ত্রুটিযুক্ত যে আমার একটি আলাদা ডোমেন ডিজাইন ব্যবহার করা উচিত (প্রয়োজনে অতিরিক্ত উপাদান যুক্ত করা), অথবা আমাকে লেনদেন ব্যবহার করতে হবে?

উত্তর:


2

আমরা একই সমস্যা আছে।

এবং আমি এই সমস্যার সমাধানের কোনও উপায়ই দেখি না তবে লেনদেনের সাথে বা ডিবিতে ধারাবাহিকতা পরীক্ষা করে সবচেয়ে খারাপ ক্ষেত্রে ব্যতিক্রম পেতে পারি।

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

আপনি যেভাবে ভারী চলেছেন তা আপনার সিস্টেম এবং ব্যবসায়িক যুক্তির উপর নির্ভর করে।
সমকালীনতা মোটেই সহজ কাজ নয়।
এমনকি যদি আপনি কোনও সমস্যা সনাক্ত করতে পারেন তবে কীভাবে আপনি এটি সমাধান করবেন? কেবল অপারেশন বাতিল করুন বা ব্যবহারকারীকে 'একীভূত' পরিবর্তন করার অনুমতি দেবেন?

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

আপনার 'লম্বা' ব্যবসায়িক লেনদেনের ক্ষেত্রে রিপোজিটরির ধারাবাহিকতা সম্পর্কে ভাবার পরামর্শও আমি আপনাকে দিই । এটি পরিণত হিসাবে এটি বেশ জটিল।


1

আমি মনে করি এটি কোনও ডোমেন-চালিত ডিজাইনের সুনির্দিষ্ট প্রশ্ন নয়, তবে একটি উত্স পরিচালন।

সম্পদগুলি অর্জন করার সাথে সাথে তা অবশ্যই লক করা উচিত ।

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


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

1
আমি দীর্ঘ-চলমান লেনদেনের ভিতরে লক করার অসুবিধাগুলির সাথে একমত, তবে @ g18c বর্ণিত দৃশ্যটি সম্পূর্ণ বিপরীত হিসাবে, অর্থাত্ স্বতন্ত্র সমষ্টি সম্পর্কে সংক্ষিপ্ত ক্রিয়াকলাপের ইঙ্গিত দেয়।
রুকামজু

0

আপনি কেন গ্রুপ সত্তায় পণ্য আইডিস সংরক্ষণ করবেন না? এইভাবে আপনি কেবলমাত্র একক সমষ্টি নিয়ে কাজ করছেন যা জিনিসগুলিকে সহজ করে তুলবে।

তারপরে আপনাকে কিছু ধরণের সম্মিলিত প্যাটার্ন প্রয়োগ করতে হবে যেমন আপনি যদি আশাবাদী সমঝোতা চয়ন করেন তবে কেবলমাত্র গ্রুপ সত্তায় একটি সংস্করণ সম্পত্তি যুক্ত করুন এবং আপডেট করার সময় সংস্করণগুলি মেলে না, তবে একটি ব্যতিক্রম নিক্ষেপ করুন ie

একটি গ্রুপে পণ্য যুক্ত করুন

  1. পণ্য বিদ্যমান কিনা তা পরীক্ষা করুন
  2. সংগ্রহস্থল থেকে গ্রুপ পান (এর সংস্করণ আইডি সম্পত্তি সহ)
  3. Group.Add (ProductId)
  4. সংগ্রহস্থল ব্যবহার করে গোষ্ঠীগুলি সংরক্ষণ করুন (নতুন সংস্করণ আইডির সাথে আপডেট করুন এবং সংস্করণটি পরিবর্তিত হয়নি তা নিশ্চিত করার জন্য একটি ধারা যুক্ত করুন)

সংস্করণ আইডি বা টাইমস্ট্যাম্পগুলি ব্যবহার করে অনেকগুলি ওআরএম এর আশাবাদী সম্মতি রয়েছে তবে এটি আপনার নিজের রোল করা সহজ। এখানে কিভাবে Nhibernate তার কাজ একটি ভাল পোস্ট http://ayende.com/blog/3946/nhibernate-mapping-concurrency


0

যদিও লেনদেনগুলি সাহায্য করতে পারে, এর অন্য একটি উপায় রয়েছে, বিশেষত যদি আপনার দৃশ্য কেবল কয়েকটি ক্ষেত্রে সীমাবদ্ধ থাকে।

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

পণ্য-আপডেটকারী ক্যোয়ারী অভ্যন্তরীণ (নতুন রেফারেন্সেড) গ্রুপে যোগদান করে। এটি যদি গ্রুপটি কেটে যায় তবে কিছুই আপডেট করার কারণ এটি নয়।

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

অনুসন্ধানগুলি মিলিত বা আপডেট হওয়া সারিগুলির সংখ্যা প্রদান করে। যদি ফলাফলটি 0 হয় তবে আপনি একটি রেসের শর্ত হারিয়েছেন এবং কিছুই করেন নি। এটি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এবং অ্যাপ্লিকেশন স্তরটি যা চায় তা হ্যান্ডেল করতে পারে যেমন শুরু থেকে আবার চেষ্টা করার মাধ্যমে।

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