ফাংশন / পদ্ধতিতে ডিএমএল অপারেশনের পরে প্রতিশ্রুতিবদ্ধতা কি প্রয়োজনীয়?


20

আমি অবাক হয়ে জানতে পারি যে ফাংশন / পদ্ধতিতে সন্নিবেশ / মোছা / আপডেটের পরে কমিট লিখতে হবে কিনা?

উদাহরণ:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

বা পদ্ধতি

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

এটি মুছে ফেলার পরেও কমিট দরকার?

নিম্নলিখিত পরিস্থিতি বুঝতে পারি না:

  1. যদি আমি এসকিউএল উইন্ডো থেকে ফাংশন / পদ্ধতিটি কল করি তবে এটির জন্য কমিট প্রয়োজন

    কিন্তু

  2. আমি যদি dbms_scheduler ব্যবহার করে ফাংশন / পদ্ধতি নির্ধারণ করি এবং কাজটি চালাই, বিবরণী মোছা স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ।

    কেন?

উত্তর:


24

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

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

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


1
ফোন কলকারী প্রক্রিয়া কলকে আবদ্ধ করে এমন কোনও লেনদেন শুরু করা কি ওরাকল-এ সম্ভব নয়? এসকিউএল সার্ভারে আপনি প্রক্রিয়াটির মধ্যে প্রতিশ্রুতিবদ্ধ করতে পারেন, তবে যদি কলকারী সেই পদ্ধতিটি কল করার আগে কোনও লেনদেন খোলেন, কলার খুব কমিট না হওয়া পর্যন্ত কিছুই প্রতিশ্রুতিবদ্ধ হয় না।
নিক চামাস 16

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

@ জাস্টিনক্যাভ যদিও এটি সত্য, স্বায়ত্তশাসিত লেনদেনগুলি ভুলে যাবেন না।
ফিলি

@ ফিল - সত্য, তবে এটি একটি খুব আলাদা প্রাণী। একটি স্বায়ত্তশাসিত লেনদেন কলারের দ্বারা করা নিঃশর্ত পরিবর্তনগুলি দেখতে পারে না এবং কলার তাকে ফিরিয়ে আনতে পারে না সুতরাং লগিংয়ের প্রক্রিয়া ব্যতীত অন্য যে কোনও কিছু স্বায়ত্তশাসিত লেনদেন ব্যবহার করার জন্য ঘোষণা করা উচিত তা অসম্ভাব্য।
জাস্টিন গুহ 21

4

আপনার প্রশ্নের উত্তর দিতে; কেন?

পোস্টটি 2 বছরের পুরানো হওয়ার কারণে আপনি সম্ভবত এটি ইতিমধ্যে জানেন। তবে আমি কেবল রেকর্ডের জন্য প্রতিক্রিয়া জানাব।

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

আপনি # 2 এ স্বয়ংক্রিয় প্রতিশ্রুতি পাওয়ার কারণ হ'ল এটি আপনার স্ক্রিপ্টটি চালনার জন্য একটি অধিবেশন তৈরি করে। এটি সম্পূর্ণ হলে এটি স্বয়ংক্রিয়ভাবে লগ অফ হয়ে যায়, যা একটি স্বয়ংক্রিয় প্রতিশ্রুতির কারণ হবে।

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