INSERT গুলি কী স্বয়ংক্রিয় প্রতিশ্রুতিবদ্ধ হয়?


13

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


কেবলমাত্র স্পষ্টতার জন্য, আমি ট্যাগ হয়েছিল 19 ঘন্টা আগে 'ইনানোডব' হিসাবে, যেহেতু ইনোডিবি কমিট / রোলব্যাক ব্যবহার করে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

এটি বিকাশকারীদের এবং ডিবিএগুলিকে লেনদেনমূলক আচরণ, লেনদেনকারীদের সমর্থনকারী কর্সপ্রেডিং অ্যাপ্লিকেশন দৃষ্টান্ত এবং তার পরিণতি (ভাল বা খারাপ) এর প্রতি মনোযোগ দেওয়ার জন্য মনে করিয়ে দেওয়ার জন্য একটি +1 পায়।
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমি আমার প্রশ্নের উত্তরে একটি মন্তব্যে আপনার প্রশ্নের উত্তর দিয়েছি।
রোল্যান্ডোমাইএসকিউএলডিবিএ

উত্তর:


10

আপনার প্রশ্নের উত্তর নির্ভর করে যে আপনি কোনও লেনদেনের মধ্যে রয়েছেন কি না - তার উপর নির্ভর করে যা একাধিক বিবৃতিতে বিস্তৃত হবে। (আপনি প্রশ্নটি InnoDB এর সাথে ট্যাগ করেছেন, মাইআইএসএএম এর সাথে উত্তরটি আলাদা হবে))

রেফারেন্স ম্যানুয়াল থেকে: http://dev.mysql.com/doc/refman/5.1/en/commit.html

ডিফল্টরূপে, মাইএসকিউএল অটোকোমিট মোড সক্ষম করে নিয়ে চলে। এর অর্থ হল যে আপনি কোনও টেবিল আপডেট করে (সংশোধন করে) কোনও বিবৃতি কার্যকর করার সাথে সাথে মাইএসকিউএল আপডেটটিকে স্থায়ী করতে ডিস্কে সংরক্ষণ করে।

সুতরাং হ্যাঁ, ডিফল্টরূপে, আপনি যদি কেবলমাত্র ব্যবহার করছেন INSERT, আপনার সন্নিবেশ করা রেকর্ডগুলি প্রতিশ্রুতিবদ্ধ হবে এবং সেগুলি আবার ঘোরানোর চেষ্টা করার কোনও মানে নেই। (এই কার্যকরভাবে মধ্যে প্রতিটি বিবৃতি মোড়কে হিসাবে একই BEGINএবং COMMIT।)

তবে, আপনি যদি লেনদেনের সাথে সুস্পষ্টভাবে ডিল করছেন, আপনাকে COMMITরেকর্ডগুলি সঞ্চয় করতে ব্যবহার করতে হবে, তবে আপনি ব্যবহার করতেও সক্ষম হবেন ROLLBACK

আপনি START TRANSACTION(বা BEGIN) ব্যবহার করে সুস্পষ্টভাবে একটি লেনদেন শুরু করতে পারেন । এটি autocommitসেটিংটি থেকে পৃথক (ডিফল্ট অনুসারে):

শুরু ট্রানজেকশন সহ, আপনি স্বীকৃতি বা রোলব্যাকের মাধ্যমে লেনদেন শেষ না করা পর্যন্ত অটোকমমিট অক্ষম থাকবে। স্বতঃসংশোধন মোডটি তারপরে তার আগের অবস্থায় ফিরে আসে।

বিকল্পভাবে, যদি autocommit=0, আমি মনে করি লেনদেনের অন্য শেষের পরে কোনও বিবৃতি লেনদেন শুরু করবে (তবে আপনি এখনও START TRANSACTIONস্পষ্টভাবে ব্যবহার করতে পারেন ); এটি আমি অন্তত এভাবে ব্যাখ্যা করি :

স্বতঃসংশোধন মোড। যদি 1 তে সেট করা থাকে তবে একটি টেবিলের সমস্ত পরিবর্তনগুলি তত্ক্ষণাত কার্যকর হবে। যদি 0 তে সেট করা থাকে তবে আপনাকে অবশ্যই কোনও লেনদেন গ্রহণ করতে COMMIT বা এটি বাতিল করতে রোলব্যাক ব্যবহার করতে হবে। যদি স্বতঃপরিচালনা 0 হয় এবং আপনি এটি 1 এ পরিবর্তন করেন, মাইএসকিউএল যে কোনও মুক্ত লেনদেনের একটি স্বয়ংক্রিয় COMMIT সম্পাদন করে। লেনদেন শুরু করার আর একটি উপায় হল START Transferences বা BEGIN বিবৃতি ব্যবহার করা। বিভাগ 12.3.1, "ট্রানজেকশন শুরু করুন, কমিট করুন, এবং রোলব্যাক সিনট্যাক্স" দেখুন।

আরও সুনির্দিষ্টভাবে "একটি লেনদেন শুরু করার অন্য উপায়" থেকে বোঝা যাচ্ছে যে একটি লেনদেন শুরু করার জন্য "অটোকোমিট = 0" নির্ধারণ করা যথেষ্ট (কমপক্ষে প্রতিটি অধিবেশন শুরুর আগে একটি অধিবেশন শুরুর আগে বা এটি অনুসরণ করে COMMIT/ ROLLBACK)। আমি যাহাই হউক না কেন স্পষ্টভাবে ব্যবহার BEGINবা পরামর্শ দেওয়ার পরামর্শ দেব , কেননা এটি লেনদেন কখন শুরু হয় বা শেষ হয় তা আরও পরিষ্কার করে তুলতে পারে।START TRANSACTIONautocommit=0

(আপনি কীভাবে কোনও লেনদেন শুরু করেন আপনার অ্যাপ্লিকেশনটি যেভাবে MySQL ব্যবহার করে তার উপর নির্ভর করে on)


1
লেনদেনের প্রোটোকলগুলি সম্পূর্ণরূপে সংজ্ঞায়িত করার জন্য একটি +1 প্রাপ্য।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ ব্রুনো, মাইআইএসএএম-এর জন্য যেখানে "কমিট" এবং "রোলব্যাক" কাজ করে না, সন্নিবেশগুলি কি অর্ধ-প্রতিশ্রুতিবদ্ধ হবে না?
পেসারিয়ার

7

ডিফল্টরূপে, InnoDB অটোকোমিট = 1 বা চালু হয়প্রতিশ্রুতিবদ্ধ হয়ে গেলে এগুলি আবার ঘুরিয়ে দেওয়া যাবে না

এটি এগিয়ে যেতে অক্ষম করতে আপনাকে দুটি জিনিসের একটি করতে হবে:

বিকল্প 1: এটিকে /etc/my.cnf এ যুক্ত করুন এবং মাইএসকিএল পুনরায় চালু করুন

[mysqld]
autocommit=0

বিকল্প 2: কোনও অর্থবহ এসকিউএল শুরু করার আগে ওপেন ডিবি সংযোগে এর একটি সম্পাদন করুন

SET autocommit = 0;
START TRANSACTION;

এই দুটি বিকল্পের অধীনে, আপনাকে একটি ম্যানুয়াল COMMIT বা একটি ম্যানুয়াল রোলব্যাক করতে হবে

বিচারকার্য স্থগিত রাখার আদেশ

যদি টেবিলটি মাইআইএসএএম হয়, তবে ব্যাখ্যাটি সহজ। যেহেতু মাইআইএসএএম স্টোরেজ ইঞ্জিনের জন্য কোনও লেনদেন নেই, তাই কার্যকর হওয়া সমস্ত INSERTs, আপডেট এবং ডিলিট স্থায়ী permanent যাই হোক না কেন কোনও রোলব্যাক নেই।


অতিরিক্ত স্পষ্টতার জন্য, আমার উত্তর ইনোডিবি এবং মাইআইএসএএম স্টোরেজ ইঞ্জিন উভয়কে সম্বোধন করে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

1
InnoDB- এ যদি অটো কমিট বন্ধ থাকে এবং আমার অ্যাপ্লিকেশন Quোকান প্রশ্নগুলি ফায়ার করছে এবং আমি কমিট কার্যকর করতে ভুলে গেছি, শীঘ্রই পরিবর্তনগুলি কীভাবে হারিয়ে যাবে?
পি কে

যদি আপনার অ্যাপ্লিকেশনটি প্রতিটি INSERT এর পরে ম্যানুয়ালি একটি কমিটকে গুলি চালায় তবে তা লিখিত এবং মুছে ফেলা যায় না। আপনার কমিট করার আগে ডিবি সংযোগটি যদি মারা যায় তবে সমস্ত পরিবর্তনগুলি হারিয়ে যায় এবং রোলব্যাক ঘটে occurs আপনি যদি কোনও ডিডিএল (ক্রিয়েট টেবিল, ড্রপ ট্যাবলেট, অ্যালটার টেবিলেট ইত্যাদি) সঞ্চালন করেন বা ম্যানুয়ালি একটি টেবিল লক ইস্যু করেন তবে INSERT গুলি স্বয়ংক্রিয়রকম হয়। আপনি যদি START ট্রান্সএশন ব্যবহার করেন তবে সমস্ত আপত্তিজনক পরিবর্তন প্রতিশ্রুতিবদ্ধ।
রোল্যান্ডোমাইএসকিউএলডিবিএ

1
সম্পর্কিত "যদি আপনি START ট্রান্সএশন ব্যবহার করেন তবে সমস্ত আপত্তিজনক পরিবর্তন প্রতিশ্রুতিবদ্ধ।" (ডিডিএলগুলির প্রসঙ্গে, অন্যথায় এটি আবার ঘুরিয়ে দেওয়া হবে) এর আগে একটি অন্তর্নিহিত প্রতিশ্রুতিও রয়েছে (ডকুমেন্টেশন অনুসারে অন্তর্নিহিত কমিট 5.5.3 সংস্করণ থেকে)।
ব্রুনো

1
"আপনি যদি স্টার্ট ট্রান্সএশন ব্যবহার করেন, সমস্ত আপত্তিজনক পরিবর্তন প্রতিশ্রুতিবদ্ধ।" - আমি মাইএসকিউএল 5.0 শংসাপত্রের স্টাডি গাইড (আইএসবিএন 0-672-32812-7) পৃষ্ঠা 418 থেকে এই ধারণাটি পেয়েছি যার নাম লেনদেন শুরু হয়, স্বয়ংক্রিয়তা সেট করুন = 1, লক ট্যাবলেটগুলি, আনলক ট্যাবলেটগুলি, ট্র্যাঙ্কেট টেবিল, নামকরণ টেবিল, ড্রপ ট্যাবলেট , ড্রপ ডেটাবেস, ক্রিয়েট ইন্ডেক্স, শুরু এবং শিরোনামের অধীনে টেবিল "কিছু পরিস্থিতিতে, বর্তমান লেনদেন সুস্পষ্টভাবে শেষ হতে পারে: আপনি নিম্নোক্ত বিবৃতিগুলির কোনও ইস্যু করলে, ইনোডিবি স্পষ্টভাবে বর্তমান লেনদেনের পূর্ববর্তী অনির্দিষ্ট বিবৃতিগুলি সম্পাদন করে এবং একটি শুরু করে নতুন লেনদেন "।
রোল্যান্ডোমাইএসকিউএলডিবিএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.