মাইএসকিউএলে উন্মুক্ত লেনদেন প্রদর্শন করুন


98

আমি কোন প্রতিশ্রুতি ছাড়াই কিছু প্রশ্ন করেছি। তারপরে আবেদন বন্ধ হয়ে যায়।

আমি কীভাবে এই উন্মুক্ত লেনদেনগুলি প্রদর্শন করতে পারি এবং তাদের প্রতিশ্রুতিবদ্ধ বা বাতিল করতে পারি?


আমি মনে করি আপনার সমস্ত লেনদেন সংযোগ বিচ্ছিন্ন হওয়ার পরে বাতিল হয়েছে, তবে 100% নিশ্চিত নয়।
জোহান

আপনি কোন ধরণের টেবিল ব্যবহার করছেন? মাইআইএসএএম, ইনোডিবি, ইত্যাদি?
সিডেসাক

@ সিডেসাক, স্পষ্টতই মাইআইএসএএম নয় এটির লেনদেন নেই, পাশাপাশি এই প্রশ্নের টেবিলগুলির সাথে আসলে কিছুই করার নেই।
জোহান

4
@ জোহান - আমি কেবল টেবিলের ধরণের উদাহরণ হিসাবে মাইআইএসএএম দিয়েছি। এবং এটা খুব করে ব্যাপার, কারণ সব টেবিল না যে সমর্থন লেনদেন সংযোগ হ্রাস হিসেবে লেনদেনের ব্যাপারে একই ভাবে আচরণ।
সিডেসাক

@ সিডেসাক, মাইএসকিউএল ডক্স খুব আলাদা কিছু বলেছে।
জোহান

উত্তর:


61

আমি কীভাবে এই উন্মুক্ত লেনদেনগুলি প্রদর্শন করতে পারি এবং তাদের প্রতিশ্রুতিবদ্ধ বা বাতিল করতে পারি?

কোনও উন্মুক্ত লেনদেন নেই, সংযোগ বিচ্ছিন্ন হওয়ার পরে মাইএসকিউএল লেনদেনকে রোলব্যাক করবে।
আপনি লেনদেন করতে পারবেন না (IFAIK)

আপনি থ্রেড ব্যবহার করে প্রদর্শন করুন

SHOW FULL PROCESSLIST  

দেখুন: http://dev.mysql.com/doc/refman/5.1/en/thread-inifications.html

এটি আপনাকে সাহায্য করবে না, কারণ আপনি ভাঙা সংযোগ থেকে কোনও লেনদেন করতে পারবেন না।


মাইএসকিউএল ডক্স থেকে কোনও সংযোগ বিচ্ছিন্ন হয়ে গেলে কী ঘটে : http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html

4.5.1.6.3। MySQL অটো-পুনঃসংযোগ অক্ষম করা হচ্ছে

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

এই আচরণটি আপনার জন্য বিপজ্জনক হতে পারে, যেমন নিম্নলিখিত উদাহরণে যেমন সার্ভারটি বন্ধ হয়ে গেছে এবং আপনি এটি না জেনে প্রথম এবং দ্বিতীয় বিবৃতিগুলির মধ্যে পুনরায় চালু করেছেন:

আরও দেখুন: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html

কীভাবে এটি নির্ধারণ এবং ঠিক
করতে হবে স্বয়ংক্রিয় পুনঃসংযোগের জন্য চেক করতে:

যদি একটি স্বয়ংক্রিয় পুনরায় সংযোগ ঘটে (উদাহরণস্বরূপ, মাইএসকিএল_পিং () কল করার ফলে), এর কোনও সুস্পষ্ট ইঙ্গিত নেই। পুনরায় সংযোগ পরীক্ষা করার জন্য, কল mysql_thread_id()করার আগে আসল সংযোগ শনাক্তকারীকে কল করুন mysql_ping(), তারপরে mysql_thread_id()সনাক্তকারী পরিবর্তন হয়েছে কিনা তা দেখতে আবার কল করুন ।

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


এই প্রশ্নের সাথে কোন সম্পর্ক নেই। এটি কেবল মাইএসকিএল ক্লায়েন্টকেই প্রভাবিত করে এবং ওপি জেনেরিক অ্যাপ্লিকেশন সম্পর্কে কথা বলছে, যার অর্থ সম্ভবত তার প্রয়োগ। অতিরিক্তভাবে, কলিং অ্যাপ্লিকেশনটি বন্ধ হয়ে যাওয়ার পরে, কীভাবে এটি লেনদেনটিকে স্মরণে রাখতে সক্ষম হবে?
সিডেসাক

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

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

@ আলেক্স অফিশিয়াল ডক্স জানিয়েছে যে, এটি ডকুমেন্টেড আচরণ। লিঙ্কগুলি দেখুন।
জোহান

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

55

যদিও মামলায় আর কোনও লেনদেন হবে না, যেমনটি @ জোহান বলেছিলেন, আপনি চাইলে নীচের ক্যোয়ারী সহ আপনি বর্তমান লেনদেনের তালিকাটি ইনোডিবিতে দেখতে পারেন।

SELECT * FROM information_schema.innodb_trx\G

দস্তাবেজ থেকে :

INNODB_TRX টেবিলটিতে প্রতিটি লেনদেনের তথ্য রয়েছে (কেবল পঠনযোগ্য কেবলমাত্র লেনদেন বাদে) InnoDB- র মধ্যে বর্তমানে লেনদেন শুরু হওয়ার সময় লকটির জন্য অপেক্ষা করছে কিনা, এবং এসকিউএল বিবৃতি লেনদেনটি কার্যকর করছে কিনা তা সহ।


মনে করবেন না যে সেই টেবিলের লেনদেনগুলি আপনার নির্দিষ্ট অনুরোধ / সেশনের অন্তর্ভুক্ত কিনা তা বলার কোনও উপায় নেই?
ক্যাপ্টেন হাইপারটেক্সট

4
দয়া করে মনে রাখবেন \Gআপনি মাইএসকিএল সিএলআই সরঞ্জামটির মধ্যে কোয়েরি আউটপুটটি ফর্ম্যাট করতে চাইলে শেষে পরিবর্তকটি কার্যকর। আপনি যদি মাইএসকিএল ওয়ার্কবেঞ্চের মতো জিইউআই সরঞ্জাম ব্যবহার করেন তবে আপনার এটির দরকার নেই।
বেলেল

30

ইনোডিবি ইঞ্জিনের অভ্যন্তরে বর্তমানে থাকা সমস্ত ক্রিয়াগুলির তালিকা পেতে আপনি show innodb status(বা show engine innodb statusমাইএসকিএলের নতুন সংস্করণগুলির জন্য) ব্যবহার করতে পারেন । আউটপুট দেয়ালে সমাহিত হ'ল লেনদেন হবে এবং কোন আভ্যন্তরীণ প্রক্রিয়া আইডি এর অধীনে চলছে।

আপনি এই লেনদেনগুলির প্রতিশ্রুতিবদ্ধতা বা রোলব্যাক জোর করতে সক্ষম হবেন না, তবে আপনি মাইএসকিউএল প্রক্রিয়াটি চালাতে পারেন, যা মূলত একটি রোলব্যাক পর্যন্ত ফোটে। এটি প্রক্রিয়াগুলির সংযোগটি মেরে ফেলে এবং মাইএসকিউএলকে এর বাম দিকে জঞ্জাল পরিষ্কার করতে দেয়।

আপনি যা দেখতে চান তা এখানে:

------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status

এই ক্ষেত্রে, এখনই InnoDB ইঞ্জিনের সাথে কেবল একটি সংযোগ রয়েছে (আমার লগইন, showক্যোয়ারী চালাচ্ছে )। যদি সেই লাইনটি কোনও আসল সংযোগ / আটকে যাওয়া লেনদেন হয় তবে আপনি শেষ করতে চান, তবে আপনি একটি করতে চান kill 10594


কোনও সংযোগ শেষ হওয়ার পরে সক্রিয়ভাবে নিহত হওয়ার প্রয়োজন নেই কারণ কোনওভাবেই সংযোগটি মারা যাবে এবং একটি ভাঙ্গা সংযোগ থেকে মুলতুবি লেনদেনের কাজ করা যাবে না যাতে তারা সদৃশ হওয়ার ভয় ছাড়াই পুনরায় জমা দেওয়া যেতে পারে।
জোহান

4
সময় সাফ হওয়ার জন্য অপেক্ষা না করে আটকে থাকা লেনদেনকে মেরে ফেলা - আপনি অন্যথায় ডেডলকগুলি ঝুঁকিপূর্ণ করেন।
মার্ক বি

হ্যাঁ, মন্তব্যটির জন্য +1 এক মিনিটের জন্য dead অচলাবস্থা সম্পর্কে ভুলে গেছেন।
জোহান

@ মার্কবি, তারা এটিকে কেন বদলে দিয়েছে show engine innodb status?
পেসারিয়ার

2

এই ক্যোয়ারীটি ব্যবহার করে আপনি সমস্ত উন্মুক্ত লেনদেন দেখতে পাবেন।

সমস্ত তালিকা:

SHOW FULL PROCESSLIST  

যদি আপনি এই আদেশটি ব্যবহার করে একটি হ্যাং ট্রানজেকশন অনুলিপি লেনদেনের আইডি এবং লেনদেনকে হত্যা করতে চান:

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