Spring同步方法NOT SYNCHRONIZED

som*_*one 4 tomcat hibernate spring-mvc jmeter

环境:

  • apache tomcat 7
  • java 7
  • oracle 11g
  • 日食
  • apache jmeter 2.1
  • 弹簧
  • 过冬

    我正在开发一个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

}
Run Code Online (Sandbox Code Playgroud)

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

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

虽然功能是同步的.

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

Azi*_*izi 5

问题是@Transactional在进入synchronized方法之前开始会话并在方法完成后提交更改,因此不会在synchronized方法中应用对数据库的更改.

请查看Spring @Transactional第10.5.1节.

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

synchronized(this){
   generateSequenseNumber();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您尝试从同一个类中的另一个方法调用事务方法,则您的建议将不起作用. (4认同)