PHP ile MySQL Kilitlenme Algılaması

2 Cevap php

PHP MySQL Ölü-Kilitler ile ilgili en iyi uygulama nedir? Ben bir try {} catch {} bloğunda tüm veritabanı aramaları sarın ve veritabanından kilitlenme hata kodu için bakmak gerekir? Sonra (geri devirdi failes bir tahmin) yine tüm işlem yeniden yayımladı mı?

2 Cevap

Eğer istemci tarafında işlenmesi gereken bir kilitlenme döner hatası 1213, hangi

Bir kilitlenme ve kilit bekleme farklı şeyler olduğunu unutmayın. Bir çıkmaz, hayır "başarısız" işlem vardır: ikisi de suçlu. Bir geri alınır garanti yoktur.

Bir çıkmaz böyle bir senaryoda oluşur:

UPDATE  t_first -- transacion 1 locks t_first
SET     id = 1;

UPDATE  t_second -- transaction 2 locks t_second
SET     id = 2;

UPDATE  t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET     id = 2;

UPDATE  t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET     id = 2;

Eğer bir kilit bekleyin sanılmasın olmadığına emin misin?

Bir başka bir işlem tarafından kilitli bir kaynak kilitlemek için çalıştığında bir kilit bekleme oluşur.

Bir kilit bekleyin yukarıdaki örnekte adımda gerçekleşir In 3.

Bu kilit tutan işlem yapılıyor veya geri yuvarlayarak dışarıdan çözülebilir (kilitlenme aksine) normal bir durum olduğu için, InnoDB kilit tutan işlem geri denemez.

Bunun yerine, sadece zaman aşımı oluştuktan sonra kilidinin çalıştı deyimi iptal edecektir.

Varsayılan zaman aşımı 50 saniye ve innodb_lock_wait_timeout kullanılarak ayarlanır.

Başarısız deyimi (acquire kilit çalıştı ki o) hatası döndürür 1205.

Evet, bir try / catch her veritabanı çağrıyı koyarak en iyi çözümdür.

But using an ORM (for Object Relationnal Mapper) would allow you not to have to worry about it. The library would manage it for you.
In PHP, there is Doctrine which is used by Symfony.

If you do not wish to use any open source library, my advice would be to develop your own and to use it instead of making direct mysql_query calls.
So you could have your try/catch directly in this library and be able to do whatever you want when a query fails.