我试图在我的创建器中添加一个悲观的锁,如doc http://grails.org/doc/latest/guide/GORM.html#locking中所示,但我有一个例外:
"ERROR util.JDBCExceptionReporter -不支持的特性:"FOR UPDATE && JOIN";SQL语句:. org.hibernate.exception.GenericJDBCException:无法执行查询“
我试着把锁加在两个地方:
def ParentInstance = Parent.createCriteria().get {
Childs {
idEq(ChildInstance.id)
lock true
}和
def ParentInstance = Parent.createCriteria().get {
Childs {
idEq(ChildInstance.id)
}
lock true
}附加问题:这是使用悲观锁定关联的正确方式吗?
谢谢
域
class Parent{
static hasMany = [Childs:Child]
}
class Child{
}Datasource.groovy
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:myApp_prodDb;MVCC=TRUE"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:myApp_testDb;MVCC=TRUE"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:myApp_prodDb;MVCC=TRUE"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}发布于 2014-11-19 12:48:58
根据形成查询的方式,Hibernate将执行不同的查询。编写查询的方式Hibernate将执行一个连接--这可能对性能有好处,因为这意味着您的连接实体已经在1查询中被预取。然而,对于锁定,这是不好的,因为每个连接表都必须被锁定,这可能会对深层层次结构产生相当大的影响。因此,您的数据库不允许这样做(我甚至不确定是否还有其他的)。
您必须在没有联接的情况下执行查询。根据您的域类实现,可以在不接触数据库的情况下完成一个简单的Child.parent.id,然后查询变成一个简单的Parent.lock(Child.parent.id)。很难说,如果没有看到实际的域类。
您始终可以做的是在一个非锁定查询中获取Parent,然后对返回的实例调用lock()方法。我建议您查看这个关于在GORM中锁定东西的优秀文章,以获得更多信息。
https://stackoverflow.com/questions/27015731
复制相似问题