“乐观”和“悲观”不一定是全球模式。可以用一种方式访问一个对象,也可以用另一种方式来访问另一个对象。
首先,这是马克·帕尔默(Marc Palmer)最近(2012年11月)的一篇非常好的文章: GORM和HiberNate的错误乐观主义。它的主要结论是,嗯,它很复杂,Grails并没有真正开箱即用地处理并发。除非你真正理解HiberNate是如何在数据库之上工作的,以及Grails是如何在HiberNate之上工作的,否则你真的可能会丢失数据或在随机的地方得到奇怪的异常。
我认为如果你关闭版本控制,基本上就是关闭锁检查。所以第三种状态基本上没有版本控制=
摘自“编程圣杯”的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等其他视图上不起作用,为什么?