首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grails/hibernate:添加悲观的使用cre否则的锁定

grails/hibernate:添加悲观的使用cre否则的锁定
EN

Stack Overflow用户
提问于 2014-11-19 11:28:05
回答 1查看 857关注 0票数 1

我试图在我的创建器中添加一个悲观的锁,如doc http://grails.org/doc/latest/guide/GORM.html#locking中所示,但我有一个例外:

"ERROR util.JDBCExceptionReporter -不支持的特性:"FOR UPDATE && JOIN";SQL语句:. org.hibernate.exception.GenericJDBCException:无法执行查询“

我试着把锁加在两个地方:

代码语言:javascript
复制
def ParentInstance = Parent.createCriteria().get {
    Childs {
            idEq(ChildInstance.id)
            lock true
    }

代码语言:javascript
复制
def ParentInstance = Parent.createCriteria().get {
    Childs {
            idEq(ChildInstance.id)      
    }
    lock true               
}

附加问题:这是使用悲观锁定关联的正确方式吗?

谢谢

代码语言:javascript
复制
class Parent{   
     static hasMany = [Childs:Child]    
}

class Child{

}

Datasource.groovy

代码语言:javascript
复制
        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"
                    }
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 12:48:58

根据形成查询的方式,Hibernate将执行不同的查询。编写查询的方式Hibernate将执行一个连接--这可能对性能有好处,因为这意味着您的连接实体已经在1查询中被预取。然而,对于锁定,这是不好的,因为每个连接表都必须被锁定,这可能会对深层层次结构产生相当大的影响。因此,您的数据库不允许这样做(我甚至不确定是否还有其他的)。

您必须在没有联接的情况下执行查询。根据您的域类实现,可以在不接触数据库的情况下完成一个简单的Child.parent.id,然后查询变成一个简单的Parent.lock(Child.parent.id)。很难说,如果没有看到实际的域类。

您始终可以做的是在一个非锁定查询中获取Parent,然后对返回的实例调用lock()方法。我建议您查看这个关于在GORM中锁定东西的优秀文章,以获得更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27015731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档