我有以下行动:
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
}
}
运行时,我有时会收到以下错误:
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]
为什么会发生此错误?我认为withNewTransaction
会阻止此错误。
答案 0 :(得分:6)
您可以使用pessimistic locking
使用:
User user = User.lock(params.userId)
或
User user = User.findById(params.userId, [lock: true])