Это мой Repository слой:весной зимуют Оптимистическая блокировка Issue
class RepositoryImpl implements Repository{
@Override
public Serializable saveOrUpdate(Object obj) {
return getSession().save(obj);
}
@Override
public Object get(Class refClass, Serializable key)
{
return getSession().get(refClass, key);
}
}
Это мой служебный слой:
class ServiceImpl implements Service{
@Autowired
Repository repository;
@Override
@Transactional
public Object findUserById(Serializable key) {
// TODO Auto-generated method stub
return repository.get(User.class,key);
}
@Override
@Transactional
public Serializable saveUser(Object o) {
// TODO Auto-generated method stub
return repository.saveOrUpdate(o);
}
}
Здесь я доступ и обновление объектов асинхронно:
class SomeClass{
@Autowired
Service service;
public void asynchronousSaveOrUpdate(){
User u = service.findUserbyId(1);
service.saveUser(1);
}
public void asynchronousfindUsersById(){
service.findUserbyId(1);
}
}
У меня есть это исключение:
[1236]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.deadline.core.model.User#1236]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:672)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
Примечание: я не хочу Transactional
для метода ServiceImpl.findUserById().
Выполнение @Transactional(readOnly =true)
или @Transactional(propagation =Propagation.REQUIRES_NEW)
решит эту проблему?
По телефону session.merge()
эта проблема будет решена, однако я не могу ее использовать.
Спасибо. Да, это произошло только при вызове saveUser (пользователя) одновременно из нескольких потоков. – Prabhakaran