2012-04-12 17 views
11

Hazırda beklemede iyimser kilitleme hakkında bir sorum var. Hibernate ile iyimser kilitlemenin derinliklerine girmeye çalışıyorum ama bir şüphem var. Hazırda bekleme, iyimser kilitleme uygulamak için sürüm yaklaşımı (tamsayı veya zaman damgası) kullanır. Yapılandırmak için @Version ek açıklamasını (veya xml yapılandırmasını) kullanabilir ve bir sürüm niteliği oluşturabilirsiniz. Diğer seçenek, optimistic-lock = "all" özelliğini kullanarak sürüm oluşturmadan yapılandırmaktır.Varsayılan olarak Hazırda Beklemede İyileştirme

Sorunun herhangi bir sürüm belirleme özniteliğini tanımlamamanız ve ayrıca iyimser bir kilit özelliği belirtmemeniz durumunda, söz konusu strateji bu durumlarda Hazırda Bekletme'yi kullanır mı? Pessimistc Kilitleme Hayır, eminim ki, bu iyimser kilitleme ama nasıl olduğunu bilmiyorum.

İlginiz için çok teşekkür ederim.

cevap

33

Eğer iyimser kilitleme kullanmak için Hazırda Beklet'i yapılandırmazsanız, hiç kilitleme kullanmaz. Yani, bu durumda son güncelleme her zaman kazanır.

Sadece açıklığa kavuşturmak için, Hibernate iyimser kilitleme işleminin DBMS işlem yalıtımından tamamen farklı olduğunu unutmayın. Hazırda bekleyen iyimser kilitleme, yalnızca bir işlemde nesneyi yüklediğinizde, değiştirdiğinizde ve daha sonra başka bir işlemde sakladığınızda çalışır. Bu durumda iyimser kilitleme, diğer bazı işlemlerin, veritabanındaki aradaki nesneyi değiştirmemesini sağlar. Bununla birlikte, iyimser kilitleme, eşzamanlı işlemlerin yalıtımını etkilemez - bu nedenle, DBMS tarafından işlem yalıtımı uygulamak için dahili olarak kullanılan kilitler (iyimser veya kötümser), Hazırda bekletme etkin olup olmadığına bakılmaksızın çalışır.

3

@axtavt, haklısınız, ancak @Version sütun olmadan hazırda bekletme iyimser uygulama hakkında soru. Mevcut

Bugün dört OptimisticLockType seçenekleri:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

Ben bu orijinal soruyu cevaplamak için yeterli olduğunu düşünüyorum.