আমি এমন একটি প্রোগ্রামে কাজ করছি যা ডিডিএল জারি করে। আমি জানতে চাই CREATE TABLEএবং অনুরূপ ডিডিএল আবার ফিরিয়ে আনা যায় কিনা
- Postgres
- মাইএসকিউএল
- SQLite
- ইত্যাদি
প্রতিটি ডাটাবেস কীভাবে ডিডিএল-এর মাধ্যমে লেনদেন পরিচালনা করে তা বর্ণনা করুন।
আমি এমন একটি প্রোগ্রামে কাজ করছি যা ডিডিএল জারি করে। আমি জানতে চাই CREATE TABLEএবং অনুরূপ ডিডিএল আবার ফিরিয়ে আনা যায় কিনা
প্রতিটি ডাটাবেস কীভাবে ডিডিএল-এর মাধ্যমে লেনদেন পরিচালনা করে তা বর্ণনা করুন।
উত্তর:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis পোস্টগ্রিসএসকিউএল এর দৃষ্টিকোণ থেকে এই সমস্যাটির একটি ওভারভিউ সরবরাহ করে।
এই ডকুমেন্ট অনুযায়ী ডিডিএল লেনদেন হয়?
এসকিউএলাইটেও লেনদেনের ডিডিএল রয়েছে বলে মনে হয়। আমি এসকিউএলাইটে ROLLBACKএকটি CREATE TABLEবিবৃতি সক্ষম হয়েছি । এর CREATE TABLEডকুমেন্টেশনে কোনও বিশেষ লেনদেনের 'গোটচাস' উল্লেখ করা হয়নি।
ALTER TABLEএসকিউএলাইটের কিছুটা সীমাবদ্ধ বিবৃতিটি আবার ঘোরানোও সক্ষম। ডকুমেন্টেশনে এটি স্পষ্টভাবে উল্লেখ করা হয়নি । সেখানে যা উল্লেখ করা হয়েছে তা হ'ল লেনদেনের অভ্যন্তরে কীভাবে "উন্নত" পরিবর্তনগুলি করা যায়।
পোস্টগ্রিএসকিউএল-র বেশিরভাগ ডাটাবেস অবজেক্টের জন্য লেনদেনের ডিডিএল থাকে (অবশ্যই সারণী, সূচিপত্র ইত্যাদি তবে ডাটাবেস, ব্যবহারকারী নয়)। তবে কার্যত কোনও ডিডিএল ACCESS EXCLUSIVEলক্ষ্য বস্তুতে একটি লক পাবে , এটি ডিডিএল লেনদেন শেষ না হওয়া পর্যন্ত এটি সম্পূর্ণ অ্যাক্সেসযোগ্য করে তুলবে। এছাড়াও, সমস্ত পরিস্থিতি একেবারেই পরিচালিত হয় না - উদাহরণস্বরূপ, আপনি যদি fooঅন্য কোনও লেনদেনটি এটিকে নামা এবং প্রতিস্থাপন টেবিল তৈরি করার সময় টেবিল থেকে নির্বাচন করার চেষ্টা করেন foo, তবে অবরুদ্ধ লেনদেনটি নতুনটি আবিষ্কার করার পরিবর্তে অবশেষে একটি ত্রুটি পাবেfoo টেবিলটি । (সম্পাদনা করুন: পোস্টগ্র্রেএসকিউএল 9.3 বা এর আগে এটি ঠিক করা হয়েছিল)
CREATE INDEX ... CONCURRENTLY ব্যতিক্রমী, এটি একই সাথে একত্রে আপডেটের অনুমতি দেওয়ার সময় একটি টেবিলের সাথে একটি সূচক যুক্ত করতে তিনটি লেনদেন ব্যবহার করে, তাই এটি লেনদেনে নিজেই সম্পাদন করা যায় না।
এছাড়াও VACUUMএকটি লেনদেনে ডাটাবেস রক্ষণাবেক্ষণ কমান্ড ব্যবহার করা যাবে না।
fooঅন্য ট্রানজেকশনটি নামার সময় এবং পুনরায় তৈরি করার সময় আমি যদি টেবিল থেকে নির্বাচন করার চেষ্টা করি তবে আমি পুরানো সংস্করণ বা ত্রুটিযুক্ত একটি ঠিক OK আমি নতুন সংস্করণে ঠিক নেই, কারণ এটি এখনও প্রতিশ্রুতিবদ্ধ ছিল না, তাই আমি অবশ্যই এটি দেখতে পাচ্ছি না। আমি একটি ত্রুটি সহ ঠিক আছি, কারণ একযোগে লেনদেনের অ্যাক্সেসে যে কোনওভাবে লেনদেন পুনরায় চালু করার জন্য প্রস্তুত থাকতে হবে। যদি ত্রুটিগুলি প্রয়োজনের তুলনায় প্রায়শই ঘটে তবে এটি কার্যকারিতা হ্রাস করতে পারে তবে এটি এখনও সঠিক।
এটি কঠোরভাবে একটি "রোলব্যাক" বলছে না, যদিও ওরাকলে FLASHBACK কমান্ডটি এই ধরণের পরিবর্তনগুলি পূর্বাবস্থায় ফেলার জন্য ব্যবহার করা যেতে পারে, যদি এটি ডাটাবেস সমর্থন করার জন্য কনফিগার করা থাকে।
দেখে মনে হচ্ছে অন্যান্য উত্তরগুলি বেশ পুরানো।
2019 হিসাবে:
START TRANSACTION ... COMMIT;যদি আপনি একই লেনদেনের মধ্যে একটি ব্যর্থ হয় তবে আপনি লেনদেনে ডিডিএল স্টেটমেন্টগুলি ফিরিয়ে নিতে পারবেন না। ( দেবের অধীনে নোট দেখুন see mysql.com/doc/refman/8.0/en/... )
মাইএসকিউএল দিয়ে করা যায় না বলে মনে হচ্ছে খুব বোবা তবে সত্য ... (স্বীকৃত উত্তর অনুসারে)
"InnoDB এ তৈরি টেবিল বিবৃতিটি একটি একক লেনদেন হিসাবে প্রক্রিয়া করা হয় This এর অর্থ হ'ল ব্যবহারকারীর কাছ থেকে একটি রোলব্যাক সেই লেনদেনের সময় ব্যবহারকারীরা তৈরি টেবিলের বিবৃতি পূর্বাবস্থায় ফিরিয়ে আনবে না।"
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
কয়েকটি ভিন্ন উপায়ে চেষ্টা করে দেখলে তা আর ফিরে আসে না ..
চারপাশের কাজটি হ'ল কেবল ব্যর্থতার পতাকা সেট করা এবং যদি কোনও প্রশ্নের ব্যর্থ হয় তবে "ড্রপ টেবিল tblname" করুন ..