2013-12-02 5 views
1

Это мой 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() эта проблема будет решена, однако я не могу ее использовать.

ответ

3

Вам нужно будет предоставить немного больше информации о том, что происходит. Эта ошибка возникает каждый раз при сохранении пользователя или только при вызове saveUser(user) одновременно из нескольких потоков? Или это происходит в любое время, когда вы звоните findUserById() или saveUser()?

Возможно, вы захотите изучить параметр Isolation для аннотации @Transactional. По умолчанию используется значение Isolation.DEFAULT (который является «уровнем изоляции по умолчанию для базового хранилища данных»).

Способ использования этой функции должен определять, какое значение вы хотите предоставить для этого аргумента. Ваша функция saveUser(user) почти всегда конфликтует с другим вызовом этой функции? Затем вы, возможно, захотите использовать:

@Transactional(isolation = Isolation.READ_COMMITTED) 

Редактировать: Я скажу, что звучит так, как будто это работает нормально. Имеет смысл, что если ваш объект изменен в другом потоке, а затем вы попытаетесь совершить тот же самый объект из другого потока одновременно, вы получите StaleObjectStateException

+0

Спасибо. Да, это произошло только при вызове saveUser (пользователя) одновременно из нескольких потоков. – Prabhakaran

Смежные вопросы