2016-09-13 25 views
6

Sanırım her şeyi elimden aldım, ama emin olmamız için OL'i mükemmel bir şekilde anladığımdan emin değilim. Genel olarak, diyelim ki bir foo'yu güncel tutmak için bir takımdayız. Bir odadayım ve zaman kazanmaya karar verdim foo'yu kendim güncelleyeceğim. Bu yüzden güncellemeye başladım. Bir dakika sonra aynı fikre sahipsiniz ve güncellemek için düzenleme sayfasına giriş yapın. İlk önce bitirirsem ne olur? İlk önce bitirirsen ne olur? Başarısız olduğu bir yapılandırmada, düzenleme yapan biri ile birisinin okuması arasındaki farkı nasıl ayırt eder. I catch ve kilidi güncellemek için yeniden yüklersem tüm değişikliklerimi kaybederim, bu nasıl çözülür? Burada, güncellemeyi yeniden yapmak kolaydır, ancak potansiyel olarak daha karmaşık bir form nesnesinin bir parçasıdır.Sabit Nesne hatası alıyor. İyimser Kilitleme: Nasıl çalışır?

Belirli bir sorun, tarayıcımda bir kopyasını yüklediğimde (daha sonra çıkabileceğim) geldi, daha sonra bunu unutup daha sonra konsolumdan birinde (ayrıca kilitle: 0?) Konsolumda bir tane güncelleştirilemedi eski nesne hatası. Tarayıcı şey fark ettim. Konsolumu kapattı. Tarayıcımı yeniden yüklemeyi denedim ve eski nesne hatası da aldım. İşte başarısız koddur:

=> 7:  self.update_attributes({ 
    8:   failed_view_attempts: self.failed_view_attempts += 1, 
    9:   failed_view_at: Time.now 
    10:  }) 
    11:  end 
(byebug) self 
#<Product id: 12... lock_version: 0> 

#=> ActiveRecord::StaleObjectError (Attempted to update a stale object: Product.) 

şeyler denedim: Başka bir örnek ben bir after_initialize geri aramasında puts "CALLED !!!!" eklendi yüklenen olsaydı

görmek için, ancak yalnızca bir kez basılmış.

Ve hatadan kurtarmak sonra self.changed kontrol ve sıfıra lock_version sütun varsayılan olarak ayarlamak için geri ["updated_at", "failed_view_attempts", "failed_view_at"]

cevap

1

Need olsun (0).

0

İyimser kilitleme, bir nesne sürüm numarasına dayanır.

Okuma ve nesne, sürüm numarasını hiç etkilememelidir.

Bazı nesneyi güncelleştirmeye çalışırsanız, bu sürüm numarası karşılaştırılır (sql'de aslında güncelleştirme deyimi kullanılır; örneğin "update ... burada sürüm = 1 ve ...") ve güncelleştirme artırıldı.

Güncellemeye çalışırken karşılaştırma başarısız olursa, eski nesnesi hatası alırsınız. Bu, değişikliklerinizi yaparken nesnenin başka biri tarafından değiştirildiği anlamına gelir.

Bu hatayı gidermek için, gerçek sürümü almak için nesneyi tekrar yüklemeniz ve değişiklikleri el ile birleştirmeniz gerekir (kullanıcıya bu konuda bilgi verir ve örneğin kullanıcının karar vermesine izin verin).

+0

Ancak, birisini düzenlerken düzenleyeceğim aynı satırın örneğini çağırırsa, sürüm numarasını çarpacaktır. Yüklemeye dayanıyor, onunla ne yaptığına değil, doğru mu? – MCB

+0

gerçekten yüklemezseniz, sürüm numarası aynı kalır, aksi halde sürüm numarası yalnızca güncelleme üzerine çarpılır (yani: sürüm = sürüm 2 = sürüm = 1) ve kayıtla eşleşmezse birçok güncelleme olur nerede o zaman eski nesne hatası alırsınız. Sayfa yükleme ile ilgili sorun, önbelleğe alınmış olması ve nesneyi DB'den yeniden yüklememeniz olabilir. –

+0

Evet, önbelleğe alınmış bir sürümü kullanan tarayıcı zaten tanıdığım bir şeydir – MCB

İlgili konular