簡體   English   中英

spring hibernate樂觀鎖定問題

[英]spring hibernate optimistic locking issue

這是我的Repository層:

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(user)時發生此錯誤? 或者它是否在您調用findUserById()saveUser()

您可能希望查看@Transactional注釋的Isolation參數。 默認值為Isolation.DEFAULT (這是“...基礎數據存儲的默認隔離級別”)。

使用此函數的方式應確定要為此參數提供的值。 你的saveUser(user)函數幾乎總是與另一個函數調用沖突嗎? 然后你可能想要使用:

@Transactional(isolation = Isolation.READ_COMMITTED)

編輯:我會說它確實聽起來像是運作正常。 有意義的是,如果你的對象在另一個線程中被修改,然后你試圖同時從另一個線程提交同一個對象,你會得到StaleObjectStateException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM