Grails:测试乐观锁定

时间:2014-06-04 07:34:44

标签: hibernate grails gorm

使用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)。

我做错了吗?

1 个答案:

答案 0 :(得分:3)

您的方法存在的问题是groupAgroupB引用了相同的托管(附加到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,创建的事务将参与用于集成测试的事务。因此,行为与没有任何手动事务块的行为相同。