当前位置: 首页 > 知识库问答 >
问题:

Grails锁定级别

丁良骏
2023-03-14

我是Grails和Goovy的新手。我在这里查看了Grails框架文档以及关于乐观与悲观锁定的讨论

从文档中可以清楚地看出:

>

  • Grails默认使用乐观锁定。

    可以关闭乐观锁定(通过使用version=false)

    如果您关闭了乐观锁定,并担心并发更新时丢失数据,则必须启用悲观锁定(通过使用lock()方法)

    我的问题:

    > < li>

    似乎有3种模式。两个显式命名:乐观和悲观,另一个是隐式的——您已经覆盖了乐观但没有启用悲观。这是正确的吗?

    如果正确的话-这个“中间”状态叫什么,有什么合法的用途吗?(问的原因是我正在查看某人的代码,有很多使用这个“中间”状态,他们没有问,没有记录等等……)。

  • 共有2个答案

    漆雕奇逸
    2023-03-14

    “乐观”和“悲观”不一定是全球模式。可以用一种方式访问一个对象,也可以用另一种方式来访问另一个对象。

    首先,这是马克·帕尔默(Marc Palmer)最近(2012年11月)的一篇非常好的文章: GORM和HiberNate的错误乐观主义。它的主要结论是,嗯,它很复杂,Grails并没有真正开箱即用地处理并发。除非你真正理解HiberNate是如何在数据库之上工作的,以及Grails是如何在HiberNate之上工作的,否则你真的可能会丢失数据或在随机的地方得到奇怪的异常。

    何松
    2023-03-14

    我认为如果你关闭版本控制,基本上就是关闭锁检查。所以第三种状态基本上没有版本控制=

    摘自“编程圣杯”的Hibernate一章-

    Grails默认为所有域类启用乐观锁定,通常不应该更改。但是如果您需要,例如当映射到旧数据库或未更新的表时,因此没有并发编辑的风险,您可以使用版本false禁用它。

     类似资料:
    • 我遵循grails文档,它说要做悲观锁定,我可以这样做: 所以这会锁定计划实例,直到保存完成。现在在我的例子中,我想一次锁定多个计划,如下所示: 我在默认情况下是事务性的 grails 服务中执行此操作,但上述行没有按预期工作。它不会锁定所有行,并在执行并发事务时引发。 如何在阅读时锁定多行? 有关更多信息,请参见相关问题:grails中的并发事务导致数据库陈旧状态异常

    • 我们有一个高并发的Grails应用程序,有几个工作线程试图更新同一个域对象Message,但是在服务中使用静态锁Message.lock(msg.id)实现的悲观锁定解决方案(transactional设置为false)会导致许多< code > HibernateOptimisticLockingFailureException 的实例。 静态锁如何导致?我的理解是,静态锁将读取最新的持久版本。

    • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

    • 主要内容:一、简介,二、Java对象头中的Mark Word,三、偏向锁,四、轻量级锁,五、重量级锁,六、自旋锁,七、锁升级过程一、简介 在讲解这些锁概念之前,我们要明确的是这些锁不等同于Java API中的ReentratLock这种锁,这些锁是概念上的,是JDK1.6中为了对synchronized同步关键字进行优化而产生的的锁机制。这些锁的启动和关闭策略可以通过设定JVM启动参数来设置,当然在一般情况下,使用JVM默认的策略就可以了。 二、Java对象头中的Mark Word HotSpo

    • 我在许多关于可重入锁的教程中看到,它们创建一个新的可重入锁并注入资源,可重入锁的锁定和解锁在try/finally块中调用。我不理解这个锁和线程中使用的资源之间的连接。下面是一个关于可重入锁的教程示例 资源代码 线程声明代码中使用的资源 有人能解释一下,这是如何防止多个线程同时访问给定的资源,从而导致争用情况的???这个可重入锁是在资源中创建对象级锁还是类级锁???

    • 这个属性似乎只有在视图是工具栏的情况下才起作用,在relativelayout等其他视图上不起作用,为什么?