Error: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

16,527

You can use pessimistic locking

Use:

User user = User.lock(params.userId)

or

User user = User.findById(params.userId, [lock: true])    
Share:
16,527
Admin
Author by

Admin

Updated on June 15, 2022

Comments

  • Admin
    Admin almost 2 years

    I have the following action:

    def index() {
    
      User.withNewTransaction {
    
       def user = User.get(params.userId)
       user.name = "test"
       user.save(flush:true)
    
       response.setContentType("image/gif")
       response.outputStream << PIXEL_BYTES_OF_A_GIF_IMAGE
       return
      }
    }
    

    When running, I sometimes get the following error:

    Message
    Executing action [index] of controller [test.TestController] caused exception: Runtime error executing action
    Caused by
    Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [test.User#1]
    

    Why does this error happen? I thought withNewTransaction would prevent this error.