gpt4 book ai didi

hibernate - StaleObjectStateException : Transaction Error in Grails

转载 作者:行者123 更新时间:2023-12-02 11:43:43 26 4
gpt4 key购买 nike

我有一个任务列表实体,其中包含许多可用的任务实体,并且某些任务可以“关闭”任务列表。

class TaskList {
...
static hasMany = [
tasks: Task
]
}

class Task {
...
static belongsTo = [taskList: TaskList]
}

现在,当任务更新并且它可以“关闭”任务列表时,我会创建一个 TaskListService调用closeList()

class TaskListService {
def closeList(TaskList taskList) {
taskList.status = "CLOSED"
taskList.save()
}
}

// TaskController pseudo-update
def update () {
Task taskInstance = Task.get(params.id)
//... do something with the taskInstance
taskListService.closeList(taskInstance.taskList)
}

我的问题是当用户更新 TaskList 实体而 TaskListService 时正在更新。

class TaskListController {
def update () {
TaskList taskListInstance = TaskList.get(params.id)
//... do some stuff
taskListInstance.properties = params
taskListInstance.save(flush:true)
}
}

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.giotta.TaskList#1]

如何避免此版本冲突?

最佳答案

如果您期望并发编辑,则必须使用显式锁定。您正在使用乐观锁定,之所以如此命名,是因为您在希望不会发生并发编辑时使用它,并且在极少数情况下发生这种情况时,您可以直接处理问题。

使用lock()方法而不是get()方法,然后进行更新。请注意,锁定仅在事务中才有意义,因此请将 id 传递给服务而不是整个实例。

class TaskListService {
def closeList(long taskListId) {
TaskList taskList = TaskList.lock(taskListId)
taskList.status = "CLOSED"
taskList.save()
}
}

// TaskController pseudo-update
def update () {
Task taskInstance = Task.get(params.id)
//... do something with the taskInstance
taskListService.closeList(taskInstance.taskListId)
}

此处我使用 taskListId 动态属性。您可能需要将其更改为 taskInstance.taskList.id

关于hibernate - StaleObjectStateException : Transaction Error in Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14737512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com