SORU
25 ŞUBAT 2010, PERŞEMBE


Nasıl mysql kaçının 'Kilitlenme kilit almaya çalışırken buldum; işlem yeniden başlatmayı deneyin'

Online kullanıcılar kaydeden orada bir masa var. Bir kullanıcı tarafından her sayfa yenilemede sayfalar üzerinde iz ve siteye son erişim tarihi tutmak için güncelleştirilmiş olur. Ben o eski kayıtları SİLMEK için her 15 dakikada bir çalışan bir cron var.

Bir 'Kilitlenme kilit; işlem yeniden başlatmayı denemek için çalışırken buldum yaklaşık 5 dakika' dün gece ve bu tabloya Ekler çalışırken görünüyor. aldım Birisi bu hatayı önlemek için ne önerebilirsiniz?

= = = = = = DÜZENLEYİN

Burada çalışan sorgu:

Siteye ilk Ziyaret:

INSERT INTO onlineusers SET
ip = 123.456.789.123,
datetime = now(),
userid = 321,
page = '/thispage',
area = 'thisarea',
type = 3

Her sayfada yenile:

UPDATE onlineusers SET
ips = 123.456.789.123,
datetime = now(),
userid = 321,
page = '/thispage',
area = 'thisarea',
type = 3
WHERE id = 888

Her 15 dakikada bir Cron:

DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND

O zaman bazı istatistikler (örn: online üyeleri ziyaretçiler online) oturum bazı sayıları yok.

CEVAP
11 Mart 2010, PERŞEMBE


En kilitlenmeleri ile yardımcı olabilecek bir kolay hile belirli bir düzende sıralama işlemleri.

İki zıt emir işlemleri, yani: iki kilitleri kilitlemek için çalışırken bir kilitlenme

  • bağlantı 1: anahtar(1), kilit anahtarı(2); . kilitleri
  • bağlantı 2: kilit, anahtar(2), kilit anahtarı(1);

Eğer ikisi de aynı anda çalıştırırsanız, bağlantı 1) (1) bağlantı 2 tuş kilidi(2) ve her bağlantı için diğer anahtarı serbest bırakmak için - ^ bekleyecek kilit . kilitlenme.

Eğer değiştirdiyseniz şimdi, bağlantıları bu sorularınıza aynı sırada tuşlara, yani kilidi:

  • bağlantı 1: anahtar(1), kilit anahtarı(2); . kilitleri
  • bağlantı 2: kilit anahtarı(1), kilitler anahtarı(2);

bir kilitlenme almak imkansız olacak.

Bu benim önerim şu:

  1. Delete deyimi dışında bir zamanda erişim birden fazla anahtar kilit başka sorularınız varsa emin olun. eğer bunu yaparsanız (ve şüpheli), onların NEREDE artan düzende (k1,k2,..kn) için.

  2. Artan: işe silmek ifadeni Düzelt

Değiştirin

DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND

İçin

DELETE FROM onlineusers WHERE id IN (SELECT id FROM onlineusers
    WHERE datetime <= now() - INTERVAL 900 SECOND order by id) u;

Akılda tutulması gereken bir diğer şey mysql belgelerine çözümsüzlük halinde istemci otomatik olarak yeniden denemek gerektiğini göstermektedir. müvekkiliniz bu mantık kod ekleyebilirsiniz. (, 3 vazgeçmeden önce bu belirli bir hata hakkında deneme derim).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • majesticdubstep

    majesticdubs

    3 Kasım 2011
  • ModNation Racers H.Q.

    ModNation Ra

    31 Ocak 2010
  • super1988guy

    super1988guy

    9 Aralık 2007