Java spring hibernate乐观锁定问题

Java spring hibernate乐观锁定问题,java,spring,hibernate,transactions,spring-transactions,Java,Spring,Hibernate,Transactions,Spring Transactions,这是我的存储库层: class RepositoryImpl implements Repository{ @Override public Serializable saveOrUpdate(Object obj) { return getSession().save(obj); } @Override public Object get(Class refClass, Serializable key) {

这是我的存储库层:

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)
注意:我不想要ServiceImpl.findUserById()方法的
事务性

执行
@Transactional(readOnly=true)
@Transactional(propagation=propagation.REQUIRES)
将解决此问题


通过调用
session.merge()
这个问题将得到解决,但是我无法使用它。

您必须提供更多关于发生了什么的信息。是否每次保存用户时都会发生此错误,或者仅当从多个线程同时调用
saveUser(user)
时才会发生此错误?还是在您调用
findUserById()
saveUser()
的任何时候都会发生这种情况

您可能需要查看
@Transactional
注释的参数。默认值是隔离。默认值是“…基础数据存储的默认隔离级别”)

使用此函数的方式应确定要为此参数提供的值。您的
saveUser(user)
函数几乎总是与对该函数的另一个调用冲突吗?那么您可能需要使用:

@Transactional(isolation = Isolation.READ_COMMITTED)

编辑:不过,我会说这听起来确实是正常的。如果您的对象在另一个线程中被修改,然后您尝试同时从另一个线程提交同一对象,您将得到
StaleObjectStateException

,您必须提供更多关于发生了什么的信息。是否每次保存用户时都会发生此错误,或者仅当从多个线程同时调用
saveUser(user)
时才会发生此错误?还是在您调用
findUserById()
saveUser()
的任何时候都会发生这种情况

您可能需要查看
@Transactional
注释的参数。默认值是隔离。默认值是“…基础数据存储的默认隔离级别”)

使用此函数的方式应确定要为此参数提供的值。您的
saveUser(user)
函数几乎总是与对该函数的另一个调用冲突吗?那么您可能需要使用:

@Transactional(isolation = Isolation.READ_COMMITTED)

编辑:不过,我会说这听起来确实是正常的。如果您的对象在另一个线程中被修改,然后您尝试同时从另一个线程提交同一对象,您将得到
StaleObjectStateException

谢谢。是的,它只发生在从多个线程同时调用saveUser(user)时。谢谢。是的,它只发生在从多个线程同时调用saveUser(user)时。