一尘不染

spring同步方法NOT SYNCHRONIZED

spring-mvc

环境:

  • apache tomcat 7
  • java 7
  • oracle 11g
  • eclipse
  • apache jmeter 2.1
  • spring
  • hibernate

我正在开发一个Web应用程序,该应用程序接收来自客户端的请求并根据要用于进一步处理的请求类型为它们生成序列号。为了生成唯一的序列号,我有一种从DB获取当前序列号并将其递增1的方法,然后使用新的序列号更新该记录。

功能:

    @Transactional
public synchronized Long generateSequenseNumber(String requestType) {
     //get current sequence number for this requestType
            //increment it by one
            //update it in DB

}

该功能工作正常,但是问题是当我从压力测试工具(JMeter)调用应用程序以每秒发送50个请求时,出现以下异常:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [

尽管功能已同步。

任何建议都会有所帮助。谢谢。


阅读 395

收藏
2020-06-01

共1个答案

一尘不染

问题在于@Transactional在进入同步方法之前开始会话,并在方法完成后提交更改,因此对数据库的更改将不会应用到同步方法内部。

请检查Spring @Transactional部分10.5.1。

您可以在调用此方法时尝试添加一个同步块,而不是使其同步:

synchronized(this){
   generateSequenseNumber();
}
2020-06-01