Taahhüt olmadan bazı sorgular yaptım. Daha sonra uygulama durduruldu.
Bu açık işlemleri nasıl görüntüleyebilir, taahhüt edebilir veya iptal edebilirim?
Taahhüt olmadan bazı sorgular yaptım. Daha sonra uygulama durduruldu.
Bu açık işlemleri nasıl görüntüleyebilir, taahhüt edebilir veya iptal edebilirim?
Yanıtlar:
Bu açık işlemleri nasıl görüntüleyebilir, taahhüt edebilir veya iptal edebilirim?
Açık işlem yoktur, MySQL bağlantı kesildiğinde işlemi geri alır.
İşlemi gerçekleştiremezsiniz (IFAIK).
Kullanarak konuları görüntülüyorsunuz
SHOW FULL PROCESSLIST
Bakınız: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
Size yardımcı olmaz, çünkü kopuk bir bağlantıdan işlem yapamazsınız.
MySQL belgelerinden bir bağlantı kesildiğinde ne olur : http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3. Mysql Otomatik Yeniden Bağlantıyı Devre Dışı Bırakma
Mysql istemcisi bir ifade gönderirken sunucuyla bağlantısını kaybederse, hemen ve otomatik olarak sunucuya bir kez yeniden bağlanmaya ve ifadeyi tekrar göndermeye çalışır. Ancak , mysql yeniden bağlanmayı başarsa bile, ilk bağlantınız sona erdi ve önceki tüm oturum nesneleriniz ve ayarlarınız kayboldu : geçici tablolar, otomatik taahhüt modu ve kullanıcı tanımlı ve oturum değişkenleri. Ayrıca, mevcut herhangi bir işlem geri alınır .
Bu davranış, sizin bilmeden birinci ve ikinci ifadeler arasında sunucunun kapatıldığı ve yeniden başlatıldığı aşağıdaki örnekte olduğu gibi sizin için tehlikeli olabilir:
Ayrıca bkz: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
Bu nasıl teşhis edilir ve düzeltilir
Otomatik yeniden bağlanmayı kontrol etmek için:
Otomatik bir yeniden bağlantı oluşursa (örneğin, mysql_ping () 'i çağırmanın bir sonucu olarak), bunun açık bir göstergesi yoktur. Yeniden bağlanmayı kontrol etmek için
mysql_thread_id()aramadan önce orijinal bağlantı tanımlayıcısını almak içinmysql_ping()arayın, ardındanmysql_thread_id()tanımlayıcının değişip değişmediğini görmek için tekrar arayın .
Gerekirse yeniden gönderebilmeniz için istemcide son sorgunuzu (işleminizi) sakladığınızdan emin olun.
Otomatik yeniden bağlanma modunu devre dışı bırakın, çünkü bu tehlikeli bir durumdur, bunun yerine kendi yeniden bağlantınızı uygulayın, böylece bir düşüşün ne zaman gerçekleştiğini bilir ve bu sorguyu yeniden gönderebilirsiniz.
mysqld.dll AKA kullanır Ve tüm işlemi içeren SQL ifadesini bellekte tutar, böylece bağlantı kesildiğinde onu oynatabilirsiniz. Veya yerel olarak diskte tutarsınız, böylece yeniden başlattıktan sonra yeniden gönderebilirsiniz.
Durumda herhangi bir işlem kalmasa da @Johan'ın dediği gibi, isterseniz aşağıdaki sorgu ile InnoDB'de mevcut işlem listesini görebilirsiniz.
SELECT * FROM information_schema.innodb_trx\G
Gönderen belgede :
INNODB_TRX tablosu, işlemin bir kilit bekleyip beklemediği, işlemin ne zaman başladığı ve varsa işlemin yürüttüğü SQL ifadesi dahil olmak üzere InnoDB içinde halihazırda yürütülen her işlem hakkında (salt okunur işlemler hariç) bilgi içerir.
\Gsondaki değiştiricinin yalnızca sorgu çıktısını mysql CLI aracında biçimlendirmek istiyorsanız yararlı olduğunu unutmayın. Mysql Workbench gibi bir GUI aracı kullanıyorsanız buna ihtiyacınız yoktur.
Sen kullanabilirsiniz show innodb status(veya show engine innodb statusşu anda InnoDB'nin motorun içinde bekleyen tüm eylemlerin bir listesini almak MySQL'in yeni sürümler için). Çıktı duvarına gömülü olan işlemler ve hangi dahili işlem kimliği altında çalıştıkları olacaktır.
Bu işlemlerin tamamlanmasını veya geri alınmasını zorlayamazsınız, ancak bunları çalıştıran MySQL sürecini öldürebilirsiniz, bu da esasen geri dönüşe dönüşür. İşlemlerin bağlantısını keser ve MySQL'in kalan karışıklığı temizlemesine neden olur.
İşte aramak isteyeceğiniz şey:
------------
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
Bu durumda, şu anda InnoDB motoruna yalnızca bir bağlantı var (giriş bilgilerim, showsorguyu çalıştırıyor ). Bu satır, sonlandırmak isteyeceğiniz gerçek bir bağlantı / takılı işlem olsaydı, o zaman bir kill 10594.
show engine innodb status?
Hepsini listele:
SHOW FULL PROCESSLIST
Bu komutu kullanarak askıda duran bir işlemi kopyalamak ve işlemi sonlandırmak istiyorsanız:
KILL <id> // e.g KILL 16543