一、問題原因
原因是首先spring事務是使用spring aop實現
可以看到提交事務是在方法調用之後,如果用synchronized對方法加鎖,當方法剛好執行完,釋放了鎖,另一個線程進入時當前事務還沒提交導致同步失敗。如果事務隔離級別設置恰當也不需要synchronized來保證數據同步。
二、解決方法
1、synchronized在事務方法的上一層鎖住。
例如:
public synchronized void father(){
children();
}
@Transactional
public void children(){
//do something
}
2、取消synchronized,通過改變事務的隔離級別解決,使用ISOLATION_SERIALIZABLE鎖表