একটি লেনদেনের মধ্যে লেনদেন


18

উদাহরণস্বরূপ নীচের স্ক্রিপ্টটি যদি ডাকা হয় তবে পোস্টগার্রেএসকিউএল প্রদর্শন কী আচরণ করবে

BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

পোস্টগ্র্রেএসকিউএল দ্বিতীয়টি বাতিল করে BEGINদেবে বা কোনও অঙ্গীকারের বিষয়ে স্পষ্টভাবে সিদ্ধান্ত নেবে এবং তারপরে BEGIN ENDএকটি পৃথক লেনদেন হিসাবে শেষে ব্লকটি চালাবে ?

উত্তর:


13

আপনার যা প্রয়োজন তা হ'ল তথাকথিত "স্বায়ত্তশাসিত লেনদেন" (ওরাকল দ্বারা সরবরাহিত একটি বৈশিষ্ট্য)। এই সময়ে পোস্টগ্র্রেএসকিউএল এ এখনও সম্ভব নয়। তবে আপনি সংরক্ষণাগারটি ব্যবহার করতে পারেন :

BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

এটি সম্পূর্ণরূপে একটি স্বায়ত্তশাসিত লেনদেন নয় - তবে এটি আপনাকে "প্রতিটি লেনদেন" সঠিকভাবে পেতে দেয়। স্বায়ত্তশাসিত লেনদেন থেকে আপনি যে জিনিসটি প্রত্যাশা করছেন তা অর্জন করতে আপনি এটি ব্যবহার করতে পারেন।

অন্যথায় এই মুহুর্তে অন্য কোনও যুক্তিসঙ্গত সমাধান নেই।


13

আপনি নিজে চেষ্টা করে দেখতে পারেন:

সতর্কতা: ইতিমধ্যে একটি লেনদেন চলছে

পোস্টগ্রিএসকিউএল এ নেস্টেড লেনদেনগুলি প্রয়োগ করা হয়নি বলে এটি কোনও নতুন (উপ) লেনদেন শুরু করে না। (আপনি কোনও pl/pgsqlফাংশনে কিছু জাদু করতে পারেন , উদাহরণস্বরূপ, এটি সেই আচরণের নকল করে।)

পোস্টগ্রেএসকিউএল 11 এর মাধ্যমে, কেউ ভাবতে পারে যে নতুন আসল সঞ্চিত পদ্ধতি এবং লেনদেন পরিচালনা করার ক্ষমতা তাদের নেস্টেড লেনদেনকে সম্ভব করে তুলবে। তবে, ডকুমেন্টেশন অনুসারে , এটি এমন নয়:

CALLকমান্ড দ্বারা চালিত পদ্ধতি এবং বেনামে কোড ব্লকগুলিতে ( DOকমান্ড), কমান্ড COMMITএবং ব্যবহার করে লেনদেন শেষ করা সম্ভব ROLLBACK। এই কমান্ডগুলি ব্যবহার করে লেনদেন শেষ হওয়ার পরে একটি নতুন লেনদেন স্বয়ংক্রিয়ভাবে শুরু হবে, সুতরাং আলাদা কোনও ট্রান্সাকশন কমান্ড নেই।


9

পোস্টগ্রাইএসকিউএল সাব-লেনদেন সমর্থন করে না, তবে SAVEPOINTবৈশিষ্ট্যটি আপনার প্রয়োজনের কার্যকরভাবে উত্তর দিতে পারে। জন্য নথিপত্র থেকে বরাত দিয়ে প্রতিশ্রুতি মাধ্যমে পিজি করতে উন্নত এক্সেস স্তর দ্বারা ভিতালি Tomilov GitHub থেকে:

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

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

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

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

উপরের লেনদেনটি 1 এবং 3 এর মান সন্নিবেশ করবে তবে 2 নয় SAVEPOINTmore আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।


0

Postgresql 9.5 বা আরও নবীনতার জন্য আপনি পিজি_ব্যাকগ্রাউন্ড এক্সটেনশন দ্বারা সরবরাহিত গতিশীল পটভূমি কর্মীদের ব্যবহার করতে পারেন। এটি স্বায়ত্তশাসিত লেনদেন তৈরি করে। দয়া করে এক্সটেনশনের গিথব পৃষ্ঠাটি উল্লেখ করুন । সমাধানটি db_link এর পরে আরও ভাল। পোস্টগ্রাইএসকিউএলে স্বায়ত্তশাসিত লেনদেন সহায়তা সম্পর্কে একটি সম্পূর্ণ গাইড রয়েছে

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