使用Grails 2.3.9
我目前正在尝试测试Grails中的乐观锁定。 documentation说,
当你执行更新时,Hibernate会自动检查 针对数据库中的版本列的版本属性以及if 它们不同会抛出StaleObjectException
在集成测试中,我有类似的东西:
def existingGroup = new Group("Group")
.save(flush: true, failOnError: true)
def groupA = Group.get(existingGroup.id)
def groupB = Group.get(existingGroup.id)
groupA.name = "Group A"
groupA.save(failOnError: true, flush: true)
groupB.name = "Group B"
groupB.save(failOnError: true, flush: true)
但是,从未抛出异常。所以,我猜,我在会话/刷新方面做错了。但所有排列(使用齐平而不是)都没有变化。我想看到抛出这个异常。
我也尝试将版本重置为0,但没有成功(通常保存groupB)。
我做错了吗?
答案 0 :(得分:3)
您的方法存在的问题是groupA
和groupB
引用了相同的托管(附加到hibernate会话)域对象。
如果您在groupA.save()
之后打印版本,则可以看到groupB
的版本也发生了变化。
您可以通过手动创建新事务来创建乐观锁定错误:
def groupA = Group.get(123)
Group.withNewTransaction {
def groupB = Group.get(123)
groupB.name = "Group B"
groupB.save(failOnError: true, flush: true)
}
groupA.name = "Group A"
groupA.save(failOnError: true, flush: true) // should fail
此处groupB
在另一个事务中被检索,修改和提交。 groupA
仍然使用旧版本,因此groupA
上的保存操作会失败。
请注意,您必须使用withNewTransaction
而不是withTransaction
。使用withTransaction
,创建的事务将参与用于集成测试的事务。因此,行为与没有任何手动事务块的行为相同。