Aynı konuyla karşılaştım; Kredi miktarını güncellemeliyim ve DB'den kredi bilgileriyle birlikte değiştirilmiş zaman almam gerekiyor. Bu temelde
eşzamanlı/atomik ben birçok seçenek çalıştı ve sorunumu çözdü birini bulduk (GÜNCELLEME sonra GET) MYSQL
içinde gerçekleştirin.
1) UPDATE
Bunun güncelleme (GÜNCELLENECEK için GET SYNC kadar kilit sürdürüldüğünü) İÇİN OPTION_1 SEÇ, ama GET kadar güncellemeden sonra kilitlemek gerekir.
2) OPTION_2 Saklı yordam
Saklı yordam Redis lua gibi senkronize bir şekilde çalışmaya olmayacak yüzden de biz bu gerçekleştirmek için senkronizasyon kodu vardır gerekir.
3) OPTION_3 İşlem
aşağıda gibi JPA EntityManager kullandık
, daha önce hiç kimsenin güncelleyebilir işlemek ve daha önce i() DB'den modifiye saatle birlikte güncellenen nesneyi alacak taahhüt düşünülmektedir. Ama en son nesneyi almadım. Sadece en son şeyi aldım.
try {
entityManager.getTransaction().begin();
//entityManager.persist(object);
int upsert = entityManager.createNativeQuery(
"update com.bill.Credit c set c.balance = c.balance - ?1
where c.accountId = ?2 and c.balance >= ?1").executeUpdate();
//c.balance >= ? for limit check
Credit newCredit = entityManager.find(Credit.class, "id");
entityManager.refresh(newCredit); //SHOULD GET LATEST BUT NOT
entityManager.getTransaction().commit();
} finally {
entityManager.unwrap(Session.class).close();
}
4) OPTION_4 LOCK sorunu çözdü, bu yüzden güncellemeden önce kilidi aldım; GET'ten sonra kilidi serbest bıraktım.
private Object getLock(final EntityManager entityManager, final String Id){
entityManager.getTransaction().begin();
Object obj_acquire = entityManager.createNativeQuery("SELECT GET_LOCK('" + Id + "', 10)").getSingleResult();
entityManager.getTransaction().commit();
return obj_acquire;
}
private Object releaseLock(final EntityManager entityManager, final String Id){
entityManager.getTransaction().begin();
Object obj_release = entityManager.createNativeQuery("SELECT RELEASE_LOCK('" + Id + "')").getSingleResult();
entityManager.getTransaction().commit();
return obj_release;
}
UP GÜNCELLEME SETİ ... FROM ... WHERE .... için geçerlidir? UPDLOCK için – Kiquenet