যদি দুটি প্রক্রিয়া একই সাথে বিষয়বস্তু পর্যবেক্ষণের পুনরায় রিফ্রেশ করার চেষ্টা করে তবে কী ঘটে?


13

ডক্স অনুসারে:

আনুষঙ্গিকভাবে বস্তুগত দৃশ্যে সমবর্তী নির্বাচনগুলি লক আউট না করে পদার্থযুক্ত দৃশ্যটি রিফ্রেশ করুন। (...)

... অন্যান্য বিষয়বস্তু ...

এমনকি এই বিকল্পের সাথে একসাথে কেবলমাত্র একটি রিফ্রেশ যেকোন একটি প্রকৃত দর্শনের বিরুদ্ধে চলতে পারে

আমার একটি ফাংশন ছিল যা একটি সামগ্রিক দর্শনের জন্য শেষ রিফ্রেশ সময়টি পরীক্ষা করে এবং যদি 60 সেকেন্ডের বেশি সময় পার হয়ে যায় তবে এটি তা রিফ্রেশ করতে পারে।

তবে, যদি আমি একই সাথে দুটি পৃথক প্রক্রিয়া থেকে একটি বস্তুগত দৃষ্টিভঙ্গি রিফ্রেশ করার চেষ্টা করি তবে কী হবে? তারা কি সারিতে থাকবে বা ত্রুটি বাড়াবে?

কোন উপাদান যখন রিফ্রেশ হয় এবং তখন এটি স্পর্শ করা এড়ানো যায় তখন কী সনাক্ত করার কোনও উপায় আছে?

বর্তমানে, আমি রিফ্রেশ করার আগে একটি সেট-টেবিল রেকর্ড পপুলেশন করেছি (সেট refreshingকরতে true) এবং তারপরে falseপ্রক্রিয়াটি শেষ হয়ে গেলে সেট করে ফেলছি।

EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) 
         VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;

তারপরে, যখনই আমি এই পদ্ধতিটি কল করি, আমি সর্বাধিক সাম্প্রতিক last_updateএবং এর refreshingমান পরীক্ষা করে দেখি । যদি refreshingএটি সত্য হয়, তবে বস্তুগত দর্শনটি রিফ্রেশ করার চেষ্টা করবেন না।

EXECUTE 'SELECT 
           extract(epoch FROM now() - (last_update))::integer, 
           refreshing
         FROM refresh_status
         ORDER BY last_update DESC
         LIMIT 1' INTO update_seconds_ago, refreshing;

IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
  -- the refresh block above
END IF;

তবে আমি নিশ্চিত নই যে রিফ্রেশিং পতাকাটি সমকালীনভাবে আপডেট হচ্ছে (আমি বলতে চাইছি এটি রিফ্রেশটি আসলে সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে)

এই পদ্ধতিরটি কি যুক্তিযুক্ত বা আমি এখানে কিছু মিস করছি?

উত্তর:


13

এই উত্তরে উল্লিখিত হিসাবে , টেবিলে " REFRESH MATERIALIZED VIEW CONCURRENTLYএকটি EXCLUSIVEলক নেয় "। ডকুমেন্টেশনে ক্র্যাম্ব ট্রেইল অনুসরণ করার পরে আমরা পড়তে পারি যে কোনও EXCLUSIVEটেবিলের একটি লক "কেবল সমবর্তী ACCESS SHAREলকগুলিকে অনুমতি দেয় , কেবলমাত্র টেবিলটি থেকে পাঠাগুলি এগিয়ে যেতে পারে"। একই অনুচ্ছেদে আমরা দেখতে পাচ্ছি যে " EXCLUSIVE... এর সাথে দ্বন্দ্ব ... EXCLUSIVE", যার অর্থ অন্য একটি REFRESH MATERIALIZED VIEW CONCURRENTLYবিবৃতি, যা একই EXCLUSIVEলকটির অনুরোধ করে , তার আগে EXCLUSIVEলকটি প্রকাশ না হওয়া পর্যন্ত অপেক্ষা করতে হবে ।

আপনি যদি অনির্ধারিত সময়ের জন্য এই লকটির জন্য অপেক্ষা করা এড়াতে চান, আপনি সেশন ভেরিয়েবলটিlock_timeout একটি বোধগম্য মান হিসাবে সেট করতে চাইতে পারেন ।


পিএস: আপনি কী মনে করেন যে এই সহকারী টেবিলটি সমকালীন (কোনও শঙ্কিত উদ্দেশ্য নয়) বলার চেষ্টা করে যা কোনও ম্যাট ভিউ ব্যস্ত আছে এবং তাই রিফ্রেশের প্রয়োজন মনে হলেও একা থাকতে হবে?
ffflabs

এটি মতামতের বিষয়; যদি আপনি মনে করেন এটি অবশ্যই আপনার যুক্তি বজায় রাখতে পারে। তবে নোট করুন, আপনার ফাংশনটি জাতি শর্তের সাপেক্ষে এবং সুতরাং এটি 100% নির্ভরযোগ্য নয়।
mustaccio

আপনি কি মনে করেন যে প্যাগ_লোকগুলি পরীক্ষা করা ঠিক আছে তা দেখার পরে মাদুর দৃশ্যের উল্লেখ আছে কিনা?
ffflabs

আবার, রেসের শর্তটি সম্ভব: আপনার চেক করে pg_locksআপনার রিফ্রেশ শুরু করার মধ্যে একটি লক স্থাপনের সম্ভাবনা রয়েছে । লক বিবাদগুলি সমাধান করার একটি সঠিক উপায় হ'ল সময়সীমা নির্ধারণ এবং ত্রুটিটি পরিচালনা করা।
মুস্তাচিও

3

মোস্তাকিও দ্বারা উল্লিখিত হিসাবে , এই প্রশ্নটি পোস্টগ্রিস রিফ্রেশ মেটেরিয়াল ভিউ লক্সের সাথে উল্লেখযোগ্যভাবে ওভারল্যাপ হয় ।

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

সুতরাং, সুনির্দিষ্ট হতে হবে: পোস্টগ্র্রেএসকিউএল ম্যানুয়াল পৃষ্ঠা অনুসারে স্পষ্টত লকিংয়ের জন্য (লিংকটি বর্তমান সংস্করণ পৃষ্ঠায়, পোস্টগ্রিস 10 এর জন্য) REFRESH MATERIALIZED VIEW CONCURRENTLYএকটি EXCLUSIVEলক নেয় takes EXCLUSIVEলক সব অন্যান্য কেশ ব্লক মনে হচ্ছে ব্যতীত ACCESS SHARE অন্যান্য অন্তর্ভুক্ত - EXCLUSIVEকেশ।

সুতরাং REFRESH MATERIALIZED VIEW CONCURRENTLYএকই দৃশ্যে দ্বিতীয় অনুরোধটি প্রকাশিত প্রথমটির দ্বারা প্রাপ্ত লকটির জন্য অপেক্ষা করবে।


ধন্যবাদ. তিনি এখনও আমার প্রশ্নের সাথে আরও নির্দিষ্ট হওয়ার জন্য তাঁর পাঠ্য সম্পাদনা করার পরে @ মোস্তাকাসিওর উত্তরটিকে গ্রহণযোগ্য হিসাবে চিহ্নিত করেছি।
ffflabs

0

মোস্তাকসিও এবং আরডিএফোজের উত্তরগুলির জন্য ধন্যবাদ , অবশেষে আমি বুঝতে পেরেছিলাম যে REFRESH ... CONCURRENTLYএক্সক্লুসিভ লক নেওয়াই পোস্টগ্র্রেএসকিউএল ডকুমেন্টেশন বলে :

এমনকি এই বিকল্পের সাথে একসাথে কেবলমাত্র একটি রিফ্রেশ যেকোন একটি প্রকৃত দর্শনের বিরুদ্ধে চলতে পারে

আমি ভীত ছিলাম যে এর অর্থ একই সাথে একযোগে রিফ্রেশ করার কোনও প্রচেষ্টা ত্রুটি ছুঁড়ে ফেলবে , তবে তাদের উত্তরগুলির আলোকে কোনও বিশেষ ত্রুটি জড়িত নেই isn't এটি কেবলমাত্র তালাবলের বিষয় যা যুগপৎ প্রচেষ্টা চালিয়ে যাবে। সুতরাং ডকুমেন্টেশন পরিবর্তে ব্যাখ্যা করা যেতে পারে:

এই অপারেশনের সময় অর্জিত লকটি বিষয়বস্তুযুক্ত ভিউ থেকে পড়া ছাড়া অন্য কোনও অপারেশনকে আটকাবে। একটি রিফ্রেশ থাকাকালীন ম্যাটেরিয়ালাইজড ভিউ রিফ্রেশ করার আরও প্রচেষ্টা ... প্রথম লকটি প্রকাশ না হওয়া অবধি কনক্যুরেন্টলি চলছে que

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