MySQL में खुला लेनदेन प्रदर्शित करें


95

मैंने बिना कमिटमेंट के कुछ सवाल किए। तब आवेदन रोक दिया गया था।

मैं इन खुले लेन-देन को कैसे प्रदर्शित कर सकता हूं और उन्हें रद्द या रद्द कर सकता हूं।


मुझे लगता है कि आपके सभी लेनदेन डिस्कनेक्ट पर रद्द कर दिए गए हैं, लेकिन 100% सुनिश्चित नहीं हैं।
जोहान

आप किस प्रकार की तालिकाओं का उपयोग कर रहे हैं? MyISAM, InnoDB, आदि?
cdeszaq

@ LCDeszaq, जाहिर है MyISAM में इसका कोई लेन-देन नहीं है, इसके अलावा सवाल का वास्तव में तालिकाओं से कोई लेना-देना नहीं है।
जोहान

2
@ जोहान - मैंने केवल तालिका प्रकार के उदाहरण के रूप में MyISAM दिया। और यह बहुत मायने रखता है, क्योंकि लेन-देन का समर्थन करने वाली सभी तालिकाएं कनेक्शन हानि पर लेनदेन के संबंध में उसी तरह व्यवहार नहीं करती हैं।
cdeszaq

@cdeszaq, MySQL डॉक्स कुछ अलग तरह से बताता है।
जोहान

जवाबों:


60

मैं इन खुले लेन-देन को कैसे प्रदर्शित कर सकता हूं और उन्हें रद्द या रद्द कर सकता हूं।

कोई खुला लेनदेन नहीं है, MySQL लेन-देन को डिस्कनेक्ट पर रोलबैक करेगा।
आप लेनदेन (IFAIK) नहीं कर सकते।

आप थ्रेड का उपयोग करके प्रदर्शित करते हैं

SHOW FULL PROCESSLIST  

देखें: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html

यह आपकी मदद नहीं करेगा, क्योंकि आप टूटे हुए कनेक्शन से लेनदेन नहीं कर सकते हैं।


MySQL डॉक्स से कनेक्शन टूटने पर क्या होता है : http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html

4.5.1.6.3। Mysql Auto-Reconnect को डिसेबल कर दें

यदि mysql क्लाइंट स्टेटमेंट भेजते समय सर्वर से अपना कनेक्शन खो देता है, तो यह तुरंत और स्वचालित रूप से सर्वर से एक बार फिर से कनेक्ट करने और फिर से स्टेटमेंट भेजने की कोशिश करता है। हालाँकि , भले ही mysql पुन: कनेक्ट करने में सफल होता है, आपका पहला कनेक्शन समाप्त हो गया है और आपके सभी पिछले सत्र ऑब्जेक्ट और सेटिंग्स खो गए हैं : अस्थायी टेबल, ऑटोकॉमिट मोड, और उपयोगकर्ता-परिभाषित और सत्र चर। साथ ही, कोई भी वर्तमान लेनदेन वापस आ जाता है

यह व्यवहार आपके लिए खतरनाक हो सकता है, क्योंकि निम्नलिखित उदाहरण में जहां सर्वर को बंद किया गया था और पहले और दूसरे बयान के बीच फिर से शुरू किया गया था, बिना यह जाने:

इसे भी देखें: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html

इसका निदान कैसे करें और इसे ठीक करें
ऑटो-पुन: संयोजन के लिए जांच करें:

यदि एक स्वचालित पुन: संयोजन होता है (उदाहरण के लिए, mysql_ping ()) को कॉल करने के परिणामस्वरूप, इसका कोई स्पष्ट संकेत नहीं है। पुनः कनेक्शन की जांच करने के लिए, कॉल mysql_thread_id()करने से पहले मूल कनेक्शन पहचानकर्ता को कॉल करें mysql_ping(), mysql_thread_id()फिर यह देखने के लिए कॉल करें कि क्या पहचानकर्ता बदल गया है।

सुनिश्चित करें कि आप क्लाइंट में अपनी अंतिम क्वेरी (लेन-देन) रखते हैं ताकि जरूरत पड़ने पर आप उसे फिर से सबमिट कर सकें।
और स्वतः-पुन: कनेक्ट मोड को अक्षम करें, क्योंकि यह खतरनाक है, इसके बजाय अपने स्वयं के पुन: कनेक्ट को लागू करें, ताकि आपको पता चले कि जब एक बूंद होती है और आप उस क्वेरी को फिर से सबमिट कर सकते हैं।


इसका सवाल से कोई लेना-देना नहीं है। यह केवल mysql क्लाइंट को प्रभावित करता है, और ओपी एक सामान्य एप्लिकेशन के बारे में बात कर रहा है, जिसका अर्थ है कि उसके आवेदन का अर्थ है। इसके अतिरिक्त, चूंकि कॉलिंग एप्लिकेशन बंद हो गया, इसलिए यह लेनदेन को स्मृति में कैसे रख पाएगा?
cdeszaq

@ LCDeszaq, यह सवाल के साथ क्या करना है सब कुछ है। एक एप्लिकेशन आम तौर पर mysqld.dllएकेए क्लाइंट का उपयोग करता है और आप SQL-स्टेटमेंट को रखते हैं जिसमें मेमोरी में पूर्ण लेनदेन होता है, ताकि कनेक्शन ड्रॉप होने पर आप इसे वापस खेल सकें। या आप इसे डिस्क पर स्थानीय रूप से रखते हैं, ताकि पुनरारंभ होने पर आप इसे फिर से सबमिट कर सकें।
जोहान

SHOW FULL PROCESSLIST में केवल मेरी प्रक्रिया सूची कमांड प्रदर्शित है। इसलिए मुझे लगता है कि खुले लेनदेन नहीं हैं। अजीब बात यह है कि autoincrement_ids खो जाना प्रतीत होता है।
एलेक्स

@alex आधिकारिक डॉक्स को बताता है, ताकि डॉक्यूमेंटेड व्यवहार हो। लिंक देखें।
जोहान

सुंदर, जोहान। प्रश्न का उत्तर दिया, और कुछ परिणामों और उन परिणामों के समाधानों को दिखाया, सभी पैराग्राफ के एक जोड़े के भीतर।
गेरार्ड ओनिल

53

हालाँकि, मामले में कोई भी शेष लेन-देन नहीं होगा, जैसा कि @ जोहान ने कहा, आप इनोओडीबी में वर्तमान लेनदेन सूची को नीचे दिए गए क्वेरी के साथ देख सकते हैं यदि आप चाहते हैं।

SELECT * FROM information_schema.innodb_trx\G

से दस्तावेज़ :

INNODB_TRX तालिका में वर्तमान में InnoDB के अंदर निष्पादित होने वाले प्रत्येक लेन-देन (रीड-ओनली ट्रांजेक्शंस को छोड़कर) के बारे में जानकारी शामिल है, जिसमें यह भी शामिल है कि क्या लेन-देन किसी लॉक का इंतजार कर रहा है, जब लेन-देन शुरू हुआ और SQL कथन लेन-देन को निष्पादित कर रहा है, यदि कोई हो।


मान लीजिए कि यह बताने का कोई तरीका नहीं है कि क्या उस तालिका में लेनदेन आपके विशिष्ट अनुरोध / सत्र से संबंधित हैं?
कप्तान हाइपरटेक्स्ट

1
कृपया ध्यान दें \Gकि यदि आप mysql CLI टूल के भीतर क्वेरी आउटपुट स्वरूपित करना चाहते हैं, तो अंत में संशोधक केवल उपयोगी है। यदि आप GUI टूल का उपयोग करते हैं जैसे कि मैसकल वर्कबेन्च, तो आपको इसकी आवश्यकता नहीं है।
बमुश्किल

29

आप InnoDB इंजन के अंदर वर्तमान में लंबित सभी कार्यों की एक सूची प्राप्त करने के लिए show innodb status(या show engine innodb statusmysql के नए संस्करणों के लिए) का उपयोग कर सकते हैं । उत्पादन की दीवार में दफन लेनदेन होगा, और वे किस आंतरिक प्रक्रिया आईडी के तहत चल रहे हैं।

आप उन लेन-देन को कमिट या रोलबैक करने के लिए बाध्य नहीं कर पाएंगे, लेकिन आप उन्हें चलाने वाली MySQL प्रक्रिया को मार सकते हैं, जो अनिवार्य रूप से रोलबैक के लिए उबलती है। यह प्रक्रियाओं के कनेक्शन को मारता है और MySQL को इसके बायीं तरफ की गंदगी को साफ करने का कारण बनता है।

यहाँ आप क्या देखना चाहते हैं:

------------
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


वास्तव में किसी कनेक्शन को सक्रिय रूप से मारने की कोई आवश्यकता नहीं है क्योंकि किसी भी समय कनेक्शन को मार दिया जाएगा और एक टूटे हुए कनेक्शन से लंबित लेनदेन को शुरू नहीं किया जा सकता है, इसलिए उन्हें दोहराव के डर के बिना फिर से शुरू किया जा सकता है।
जोहान

3
बेहतर है कि अटके हुए लेन-देन को खत्म करने के लिए समय-समय पर सफाई किए बिना इंतजार करें - आप गतिरोधों का जोखिम उठाते हैं।
मार्क बी

आह हाँ, उस टिप्पणी के लिए +1। एक मिनट के लिए उन गतिरोधों के बारे में भूल गए।
जोहान

@MarcB, उन्होंने इसे क्यों बदल दिया show engine innodb status?
पैचेइर

1

इस क्वेरी का उपयोग करके आप सभी खुले लेनदेन देख सकते हैं।

सबकी सूची बनाओ:

SHOW FULL PROCESSLIST  

यदि आप इस आदेश का उपयोग करके हैंग ट्रांजेक्शन कॉपी ट्रांजेक्शन आईडी को मारना चाहते हैं और ट्रांजेक्शन को मारना चाहते हैं:

KILL <id>    // e.g KILL 16543
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.