2016-09-27 86 views
10

Ben bazı maksimum yeniden deneme sayısını vurur kadar bir varlık defalarca kurtarma girişimleri bir süre döngü ile çözmeye çalışan bir bir eşzamanlılık sorunu var "toplu tahliye edildikten sonra hala JDBC ifadeler yer". Bu sorunu çözmek için başka yollar olup olmadığını konuşmaktan kaçınmak istiyorum. Bununla ilgili diğer Stackoverflow yayınlarım var. :) Uzun lafın kısası: türetilmiştir ve çarpışmaları önlemek için artan tutar sayısal bölümünü içerir bir sütun üzerinde benzersiz bir kısıtlama yoktur. Bir döngü, ben:JPA eşzamanlılık sorunu

  1. seçme max (some_value)
  2. artım sonucu
  3. açıkça o nedeniyle başarısız olursa, varlık temizlemek ve bu yeni sonuçla yeni nesneyi kaydetmek için
  4. girişimi benzersiz dizin, DataAccessException yakaladım.

    17:20:46,111 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements 
    17:20:46,111 INFO [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement" 
    

    Ve yeni İstisna yakalandı:

Bütün bunlar alıyorum, döngü 1. adıma geri gittiğinde dışında iş gibi görünüyor ve seçmek için çalışır. Bu benzersiz kısıtlama ihlali neden olur ve taraf yöneticinin toplu silmiyor DataAccessException atar ilk fışkırma gibi görünüyor. Bununla başa çıkmanın uygun yolu nedir? Spring'i JPA ile kullanıyorum ve varlık yöneticisine doğrudan erişimim yok. Buna ihtiyacım ama bu soruna bir acı çözüm buysa enjekte sanırım. Size bir kez floş şey ve başarısız olur ve bir istisna, işlem geri rulo olarak işaretlenir atılır -

cevap

5

Bunu yapamaz. Yani sen durum yakalamak ve devam, bir geri alma ile bitireceğiz o önemli değil demektir. Varsayılan Spring'in işlem yöneticisi tarafından her kontrolsüz istisna üzerinde geri alma olacak - Aslında atıldı Ne istisna hiç önemli değil. işlem muhtemelen işaretlenir beri, o da bu kısıt ihlali durumunda size yardımcı olmayacaktır - Sen Özellikle

Edit (Ek açıklamalarda sürücüsü hareketleri kullanıyorsanız şartıyla) @Transactional notu üzerine bir noRollbackFor tanımlayarak bunun üstesinden gelebilir veritabanı düzeyinde geri alma olarak.