Bu , iki işlemin önemsiz bir durumda (her ikisinin de tek bir satırda çalıştığı) sıralı olarak gerçekleşmesini nasıl zorlayacağımı bilmek istediğim bu ilgili sorudan fırladı . Bir cevap aldım - SELECT ... FOR UPDATE
her iki işlemin de ilk satırı olarak kullan - ancak bu bir soruna yol açar: İlk işlem asla gerçekleştirilmez veya geri alınmazsa, ikinci işlem süresiz olarak engellenir. innodb_lock_wait_timeout
Değişken ikinci işlem yapmaya çalışıyorum müşteri "Maalesef, tekrar deneyin" anlattı olacaktı ... ama bildiğim kadarıyla söyleyebilirim, bir sonraki sunucu yeniden başlatma kadar tekrar çalışırdım bundan sonra saniye sayısını ayarlar. Yani:
- Kuşkusuz
ROLLBACK
bir işlem sonsuza dek sürüyorsa zorlamak için bir yol olmalı ? Bu tür işlemleri öldürmek için bir daemon kullanmaya başvurmalıyım ve eğer öyleyse, böyle bir daemon nasıl olurdu? - Bir bağlantı işlem tarafından
wait_timeout
veyainteractive_timeout
işlem ortasında kesilirse, işlem geri alınır mı? Bunu konsoldan test etmenin bir yolu var mı?
Açıklama : innodb_lock_wait_timeout
işlemin vazgeçmeden önce kilidin serbest bırakılmasını bekleyeceği saniye sayısını ayarlar; istediğim bir kilidi serbest bırakmaya zorlamanın bir yoludur .
Güncelleme 1 : innodb_lock_wait_timeout
İkinci işlemin birincisi tarafından engellenmediğinden emin olmak için neden yeterli olmadığını gösteren basit bir örnek :
START TRANSACTION;
SELECT SLEEP(55);
COMMIT;
Varsayılan ayarı ile innodb_lock_wait_timeout = 50
bu işlem 55 saniye sonra hatasız olarak tamamlanır. Ve satırdan UPDATE
önce bir eklerseniz , aynı satıra SLEEP
çalışan başka bir istemciden ikinci bir işlem başlatırsanız SELECT ... FOR UPDATE
, uykuya dalan işlem değil, zaman aşımına uğrayan ikinci işlemdir.
Aradığım şey, bu işlemin huzurlu uykusuna son vermeye zorlamanın bir yoludur.
Güncelleme 2 : Hobodave'ın yukarıdaki örneğin ne kadar gerçekçi olduğu konusundaki endişelerine yanıt olarak, alternatif bir senaryo: Bir DBA canlı bir sunucuya bağlanıyor ve çalışıyor
START TRANSACTION
SELECT ... FOR UPDATE
burada ikinci satır uygulamanın sık sık yazdığı bir satırı kilitler. Ardından DBA kesintiye uğrar ve işlemi sonlandırmayı unutarak yürür. Uygulama, satır kilidi açılana kadar durur. Bu hatanın bir sonucu olarak uygulamanın takıldığı süreyi en aza indirmek istiyorum.
ROLLBACK
fazla sürerse ilk işleme zorlamak istiyorum n
. Bunu yapmanın bir yolu var mı?
MYSQL
bu senaryoyu önlemek için bir yapılandırma yok merak ediyorum . Çünkü istemcilerin sorumsuzluğu nedeniyle sunucu asmak kabul edilemez. Sorunuzu anlamak için herhangi bir zorluk bulamadım, ayrıca çok alakalı.