2015-02-14 24 views
6

Yalnızca DB'm olarak Redis kullanıyorum ve istemcim ServiceStack.Redis. İki eşzamanlı isteğin bir anahtarı güncellemesi gerekirse, o zaman bir yarış durumu olabilir. ÖrneğinRedis'i kullanarak yarış koşullarını nasıl önleyebilirim?

A:

  1. int a = Get anahtar
  2. ÇOK
  3. a = a -
  4. Set anahtar bir
  5. EXEC

B:

  1. int a = Get anahtar
  2. ÇOK
  3. a = a - 100
  4. Set anahtar bir
  5. EXEC

eğer Kökeni "anahtar" 1000'dir. Eğer A ve B yayılımı seri ise ized, "anahtar" ın bu iki operasyonunun doğru sonuçları 800 olacaktır. Fakat A ve B aynı zamanda gerçekleşirse. A'nın işlem yapabilmesi için, B Operasyonu B, "anahtar" dan 1000 değerini alır ve 900'ü "anahtar" olarak ayarlar. İstediğim bu değil. Bu tür yarış koşullarını nasıl önleyebilirim, "İZLE" yi kullanabilir miyim?

+0

Evet SAATİ kullanın. –

cevap

5

Onların tek atomik işlem olarak yürütülür; yani Transactions in Redis, REDIS işlemler esasen birden operasyonlar yığınlamadır üzerinde doküman okumalısınız.

sadece operasyonları dozajları beri, herhangi bir işlem bağlamında okur gerçekleştiremez. İhtiyacınız olan tüm okumalar, işlemin başlamasından önce alınmalıdır. Daha sonra anahtar işlem başarısız olur modifiye edilmiş ve hiçbir işlem işlenecek eğer işlem, tamamlanmadan önce değiştirilmemelidir herhangi tuşları izlemek için Redis WATCH kullanabilirsiniz.

+0

Bana bunu hatırladığın için teşekkürler. Programımda, programımda bir işlem başlatmadan önce okudum. Sözde kodumu doğru sıraya dönüştürdüm. Yani, WATCH benim problemimi çözmeli mi? herhangi alışkanlık işlem yürüttü önce anahtar değiştirildiği takdirde yürütülecek işlem sağlayacaktır okumadan önce SAATİ kullanarak –

+0

@AllanYang Evet. – mythz

İlgili konular