রোলব্যাক সদ্য তৈরি করা গন্তব্য সারণীতে INSERT দেওয়ার পরে কাজ করে না


11

আমি পিএইচপি-স্ক্রিপ্টে কাজ করছি যা customers.csvমাইএসকিউএল টেবিলের ( customers) মধ্যে সিএসভি ফাইল ( ) আমদানি করে ।

মাইএসকিএল টেবিলের মধ্যে সিএসভি-ফাইলের সামগ্রী সন্নিবেশ করার আগে আমি প্রথমে মূল customersটেবিলটি ব্যাক আপ করছি ।

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

সমস্যাটি হ'ল রোলব্যাক কাজ করার মতো মনে হয় না যখন আমি ঠিক কথার পরে ডেকে আছি INSERT INTO: পিএইচপিএমআইএডমিনের মাধ্যমে ডাটাবেস চেক করার সময় আমি নতুনভাবে তৈরি টেবিলটি দেখতে পাচ্ছি এবং রোলব্যাকের পরে এটি উপস্থিত রয়েছে এটি রোলব্যাকের পরে উপস্থিত রয়েছে

অপারেশনগুলির লগ এখানে:

[2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] []
[2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] []
[2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] []
[2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] []
[2015-01-19 14:08:50] DEBUG: "ROLLBACK" [] []

সুতরাং আমি অবাক হয়েছি কেন Depsite ROLLBACKবলা হয়, লেনদেন বাতিল হয় না। আমি বুঝতে পারি যে CREATE TABLEএটি লেনদেনের প্রকৃতির নয় এবং এগুলি আবার ঘুরিয়ে দেওয়া যায় না। তবে আমি তা ধরেই নিছিলামINSERT INTO ধরেই নিয়েছিলাম এটি সারি সন্নিবেশ করানোর (স্কিমাটি সংজ্ঞায়িত না করার) সাথে সম্পর্কিত, আসলে বাস্তবে লেনদেন হবে এবং রোলব্যাকের পরে আমি খালি গন্তব্য টেবিলটি রেখে দেব। এটা কেন হয় না?

এবং এখানে আউটপুট SHOW CREATE TABLE customers(সুতরাং আমার টেবিলটি InnoDb):

CREATE TABLE `customers` (
 `Code` varchar(32) NOT NULL,
 `Name` varchar(128) DEFAULT NULL,
 `Price` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`Code`),
 KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

এবং এখানে বর্ণনামূলক টেবিলের জন্য আউটপুট:

CREATE TABLE `customers__20150119_14_08_20` (
 `Code` varchar(32) NOT NULL,
 `Name` varchar(128) DEFAULT NULL,
 `Price` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`Code`),
 KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

আচরণ যদি আপনি প্রথম পুনর্বিন্যাস একই create table, তারপর start transaction, insert, rollback?
ypercubeᵀᴹ

আমি এই কথাটি বলতে যাচ্ছিলাম !!!
RolandoMySQLDBA

আপনি কি আপনার প্রোগ্রামের সংযোগটিতে স্বতঃসংশোধন অক্ষম করবেন?
মুস্তাকিয়ো

উত্তর:


13

কারণটি হ'ল কিছু বিবৃতি যেমন CREATE TABLEএকটি অন্তর্নিহিত প্রতিশ্রুতি দেয়। আপনি তাদের সম্পর্কে ডকুমেন্টেশনে পড়তে পারেন: বিবৃতি যা একটি অন্তর্নিহিত প্রতিশ্রুতি দেয়

সুতরাং বিবৃতিগুলির মূল ক্রম:

START TRANSACTION
SHOW TABLES LIKE customers
CREATE TABLE `customers__20150119_14_08_20` LIKE `customers`
INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers`
ROLLBACK

এর মধ্যে প্রসারিত হবে:

START TRANSACTION ;   -- transaction context created
SHOW TABLES LIKE customers ;

COMMIT ;              -- CREATE TABLE forces commit before itself
                      --     (at this point the previous transaction is done.)
START TRANSACTION ;   -- and a new transaction  
CREATE TABLE `customers__20150119_14_08_20` 
    LIKE `customers` ;
COMMIT ;              -- CREATE TABLE forces commit after itself. 
                      -- At this point there's no transaction context

START TRANSACTION ;   --  starts a new transaction
INSERT INTO `customers__20150119_14_08_20` 
    SELECT * FROM `customers` ;
COMMIT ;              -- caused by "autocommit on" setting (guess). 

ROLLBACK ;            -- this rollback HAS NOTHING to undo

সমাধানটি হ'ল CREATE TABLEবিবৃতি দেওয়ার পরে লেনদেন (বা একটি নতুন) শুরু করা বা অস্থায়ী টেবিল ব্যবহার করা।


সম্পাদনা করার জন্য @ ডিমিট্রি, থানেক্স
ypercubeᵀᴹ

1
এবং আপনার ভাল শব্দগুলির জন্য @ রোল্যান্ডোমাইএসকিউএলডিবিএ। আমি আজ এফজিআইটিডব্লিউ (এবং আপনার চেয়ে 15 সেকেন্ড দ্রুত;)
ypercubeᵀᴹ

@ টাইপ्यूब স্বাগত! এই প্রকৃত টেবিলটি ঠিক কোথায় আসবে তা চিত্রিত করতে আমার কিছুটা সময় লেগেছে cause an implicit commit... সুতরাং কাগজে এই রূপরেখাটিই করতে হয়েছিল :) @ রোল্যান্ডোমাইএসকিউএলডিবিএ দ্রুত ইনপুটটির জন্য ধন্যবাদ। আমি গত বছর আপনার কয়েক ডজন জবাব পড়েছি এবং তারা আমাকে অনেক সাহায্য করেছে !!
দিমিত্রি কে

সুতরাং তুমি বলতে চাচ্ছ অন্তর্নিহিত কমিট আগেINSERT , DDL বিবৃতি দ্বারা সৃষ্ট, এছাড়াও একরকম ঘটায় একটি কমিট পর সন্নিবেশ?
মোস্তাকসিও

1
হ্যাঁ, যুক্তিটির দুটি অংশ রয়েছে তবে আমার মতে মূল অংশটি, ওপিটি নির্ধারণ করতে পারেনি এটি তৈরি টেবিলের দ্বারা নিযুক্ত প্রতিশ্রুতিবদ্ধ।
ypercubeᵀᴹ

3

দেখে মনে হচ্ছে বিবৃতিগুলির ক্রমটি সমস্যার সৃষ্টি করছে।

আমার পুরানো পোস্ট সারিটি এসিডি লেনদেনের ইনডোডাবের মধ্যে লক করার সময় , আমি 12 টি স্টেটমেন্টের নাম দিয়েছি যা একযোগে একটি লেনদেন ভেঙে দেয়। আপনার বিশেষ ক্ষেত্রে এটি CREATE TABLEবিবৃতি ছিল ।

একবার আপনি ... ব্লকের CREATE TABLEভিতরে দৌড়ে গেলে রোলব্যাক করার কোনও ফ্রেমওয়ার্ক ছিল না।START TRANSACTIONCOMMIT/ROLLBACK

শুধু CREATE TABLEআগে চালানো START TRANSACTIONএবং আপনার ভাল করা উচিত।

একবার চেষ্টা করে দেখো !!!

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