錯誤方法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層。