আপনি কীভাবে একটি ডেটাবেসে জাতি অবস্থার জন্য পরীক্ষা করেন?


30

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

আমি সাধারণত জানি যে কোন সমবর্তী জিজ্ঞাসাটি সমস্যার কারণ হতে পারে, তবে সঠিক আচরণটি ঘটে কিনা তা বোঝার জন্য তাদের কীভাবে একযোগে চালাতে হয় তা আমি জানি না (যেমন আমি সঠিক ধরণের লক ব্যবহার করেছি), সঠিক ত্রুটিগুলি নিক্ষেপ, ইত্যাদি

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

আপডেট: সমাধানটি প্রোগ্রামেটিক হলে আমি এটিকে পছন্দ করতাম। কোনও চাপ আছে কিনা তা নিশ্চিত করার জন্য আমি স্বয়ংক্রিয় পরীক্ষাগুলি লিখতে পারি।


"রেস কন্ডিশন" দ্বারা আপনি কি "ডেডলক" বলতে চান?
গাইউস

2
@ গাইউস ... যদিও আমি বিশ্বাস করি না যে এটি কিছু জাতি শর্তের একটি সম্ভাব্য ফলাফল
xenoterracide

একটি ডাটাবেসে @ গাইস রেসের শর্তাবলী কোনও টেবিল তৈরি হওয়ার আগে তা ফেলে দেওয়ার বা এটি সন্নিবেশ করার আগে একটি সারি আপডেট করার মতো কাজ করবে। সাধারণত আমি কল্পনা করব যে এটি অ্যাপ্লিকেশন যুক্তি দ্বারা ডেটাবেসের বাইরেই পরিচালনা করা হয়।
ডি

rowোকানোর আগে একটি সারি আপডেট করা? এটি একটি ডিবি সমস্যা সৃষ্টি করবে না। কোনও রেসের শর্তটি কোনও সারি আনা এবং এটি আপডেট করার মতো হবে না তবে আপনার সারিটি আনার পরে কিন্তু আপনার আপডেটটি প্রক্রিয়া করার আগে অন্য কোনও ব্যবহারকারী এটি আপডেট করবেন।
xenoterracide

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

উত্তর:


11

আমি আমার টি-এসকিউএল মডিউলগুলি দিয়ে সর্বদা এটি করি।

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

আমি এখানে এবং এখানে কয়েকটি উদাহরণ লিখেছি ।


4

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

যদি এটি কাদা হিসাবে পরিষ্কার মনে হয়, তাই বলতে দ্বিধা করবেন না ;-)


আপনি একটি ধাপে ধাপে উদাহরণ দিতে পারেন? এবং প্রোগ্রাম্যাটিক পরীক্ষাগুলি একই কাজ করার জন্য লেখা যেতে পারে?
xenoterracide

1

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

প্রক্রিয়া 1 প্রক্রিয়া 2

প্রক্রিয়া শুরু করুন 2 >>                            
2 টি এটির কাজটি করার অনুমতি দেয়। 
। সারি লক করুন বা ডেটা পরিবর্তন করুন।
। 1 টির কাজটি করার অনুমতি দিতে বিলম্ব।
সারিগুলি লক করার বা ডেটা পরিবর্তন করার চেষ্টা করুন। ।
যথাযথ হ্যান্ডলিং সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য চেক করুন। ।
শেষ। ।
                                                শেষ।

জাতিদের পরিস্থিতি কীভাবে পরিচালনা করতে হবে এবং আরও গুরুত্বপূর্ণভাবে কীভাবে তাদের পরীক্ষা করে নেওয়া যায় সে সম্পর্কে চিন্তাভাবনা দেখাই ভাল।


আমি ইউনিট পরীক্ষার মতো এ জাতীয় পরীক্ষাগুলি বর্ণনা করব না, কারণ ইউনিট পরীক্ষাগুলি অবশ্যই প্রতিবার ঠিক একই পথে চলতে হবে। প্রতিযোগিতামূলক প্রক্রিয়াগুলি বিরতিহীনভাবে অন্তর্ভুক্ত হয়ে যায়, প্রতিবারের মতো ঠিক একইভাবে হয় না।
একে

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

-2

যতক্ষণ আপনি সারিগুলিকে লক করেন ততক্ষণ আপনি রেস কন্ডিশনে যাবেন না কারণ সাধারণত কোনও লকিং না থাকাকালীন হয়।

যদি কোনও প্রশ্ন যদি আপনার প্রশ্নকে দীর্ঘায়িত করে তবে আপনি অচল হয়ে যেতে পারেন।

ডাটাবেস বড় হওয়ার সাথে সাথে প্রশ্নের পরিবর্তন হতে পারে বলে এটি পরীক্ষা করা শক্ত।

100 000 সারি পরীক্ষার ডেটা দিয়ে সূক্ষ্ম কাজ করে এমন প্রশ্নগুলি 10 000 000 সারি দিয়ে চার্টে চলে যায়।

এই ধরণের সমস্যাটি আগে থেকে পাওয়া খুব কঠিন হতে পারে তবে অনেক ডিবিতে ধীর অনুসন্ধানগুলি সনাক্ত করার কিছু পদ্ধতি রয়েছে।

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

আপনি যদি নিজেরাই লক করেন তবে এটি অন্য গল্প, তবে সেখানে আমি সহায়তা করতে পারি না।


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

হ্যাঁ আমি নিজের বোঝাতে চাইছিলাম এবং সাধারণত ডাটাবেস ড্রাইভার লকিং, সারি, টেবিল বা সম্ভবত ক্ষেত্র পরিচালনা করে তবে আমি সম্ভবত আপনি এমন কোনও ডিবি ব্যবহার করছেন যে লকিং পরিচালনা করে না;)

..আমি নিশ্চিত যে আমার কাছে একাধিক স্টেটমেন্ট লেনদেন হয়েছে যে আমার ডিবি জানতে পারবে না যে কোন সারিগুলিকে স্বয়ংক্রিয়ভাবে লক করা select for updateহবে ... এমন জিনিসগুলি যদি তারা না করত তবে তাদের অস্তিত্ব থাকত না ...
xenoterracide
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.