Spring - synchronized關鍵字在@Transactional注解的方法中失效


錯誤方法1:

@Service
public class SynchronizedService{
    @Transactional
    public synchronized void method() {
            ...
    }
}

錯誤方法2:

@Service
public class SynchronizedService{
    @Transactional
    public void methodTwo() {
        synchronized(this){
                    ...
        }
    }
}

在以上兩個方法中,同步方法/代碼塊均失效。

原因:

由於在Spring的AOP中,被@Transactional注解的方法的事務是由Spring生成的一個代理類來處理的。所以,在執行完同步代碼塊和代理類提交事務的空隙中,別的線程是有機會進入到同步代碼塊的。這樣一來,就有幾率訪問到過期的數據,從而導致並發問題。

解決方案:

1.去掉@Transactional注解。

2.將synchronized關鍵字提到controller層。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM