`
Jcat
  • 浏览: 49799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Grails的乐观锁产生的异常无法捕获

阅读更多
今天是一个小想法,引出一堆问题,一顿扫盲呀,基础很重要呀。这也印证了之前在论坛讨论Grails时我的观点:
引用
grails不适合新手学习哦~
Grails是一个敏捷的MVC框架,更准确的说是以spring、hibernate为基础的一堆框架的集合。优点就是开发迅速,“容易上手”。

这里,容易上手是针对已经熟悉Java开发的同学:熟悉Servlet、熟悉Spring、熟悉Hibernate等。有这些基础的同学可以很快将Grails运用自如。

但是,Grails不适合作为学习Java Web开发的入门内容,原因就是它太敏捷。没错,照着官方文档,可以很轻松写出Hello World,基于scaffold可以很快搭建出一个小小的原型,新手肯定特别兴奋。但问题就是,当你想要深入一点的时候,会发现缺乏前述各种框架的知识,甚至缺乏对JavaEE的基础知识,然后就会迷失、无从下手。


今天的小想法就是想测试一下Grails的乐观锁机制,于是就引出了以下问题:
1. 要测试乐观锁,就需要多线程,而且我想把颗粒度模拟的很细,模拟一些很极端的情况。琢磨半天,发现IDEA有多线程debug的功能(其实大多数IDE都有),用起来老强大了。


默认是ALL,也就是单线程的,浏览器B的操作需要等浏览器A的断点完成后才能进行。


改成Thread,就可以debug并发的情况了。两个线程遇到断点都会停下来,还可以选择控制让谁先执行断点,很方便呀。


2. 有了强大工具支持,可以开始试验了。

如上图,设计了一个试验例子。本以为最终能够模拟出数据一致的情况,但实际却抛出了乐观锁的异常。。。误导我的正是Grails生成的controller update代码,让我误以为需要人为判断version(我还以为这叫乐观锁呢)
引用
  if (testInstance.version > version) {
                render(view: "edit", model: [testInstance: testInstance])
                return
            }

错误的理解,需要写代码判断version
正确的理解,其实是由Hibernate在save的时候自行判断version,由此实现乐观锁

3. 好吧,既然你能抛出异常(StaleObjectStateException - Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect),那我就try-catch处理之



结果是怎么catch也catch不到。。。百度也烂到家,根本搜不到有用的东西。于是挂上vpn,google是王道。

引用
try{
   getHibernateTemplate().delete(userObj);
} catch (StaleObjectStateException e) {
   e.printStackTrace();
}
How do i catch this exception ??

You won't be able to catch it there, because it's not the delete call that throws the exception, but the flush of the session, which happens later (before the execution of a query, or before the transaction commit).
You should not catch this exception anyway, because when Hibernate throws an exception, you can't continue using the session anymore: it's in an unstable state. The only part of the application where such an exception can be caught is outside of the transaction, in order to display an error message to the user (or retry, but this won't be possible in this particular case).

简单的说,就是异常并不是由save()抛出的,而是经过一系列传递由Hibernate抛出的,而且此时会话已经无法使用了。直截了当说,这类异常无法捕获
这也说明了,为什么Grails生成的代码中,人为判断了一下,这么做可以很大程度上避免异常。(相当于在较长时间的人工录入表单之后,进行了一次version验证,并处理;而只有在像我模拟的极端情况,才会引发异常)
  • 大小: 21.1 KB
  • 大小: 27 KB
  • 大小: 93.6 KB
  • 大小: 31.7 KB
分享到:
评论

相关推荐

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...

    Grails Grails Grails

    **Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之上,旨在简化开发过程并提高生产力。Grails 的设计深受Ruby on Rails的影响,提供了MVC(模型-视图-控制器)架构模式...

    grails中文入门简介

    GORM中的高级特性包括自定义映射选项、事务编程以及乐观锁和悲观锁等并发控制机制。 在Web层的开发中,Grails提供了灵活的控制器来处理请求和响应。它还包含了Groovy Server Pages(GSP),这是一种基于Groovy的...

    Grails权威指南 Grails权威指南

    《Grails权威指南》是一本全面深入探讨Grails框架的专著,旨在帮助读者掌握这一强大的Web开发工具。Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同...

    Eclipse下搭建Grails项目

    【Grails项目搭建详解】 Grails是一个基于Groovy语言的开源Web应用框架,它简化了开发过程,尤其适合快速构建动态网站。在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. *...

    grails-用户手册

    《Grails用户手册》 Grails,作为一个基于Groovy语言的开源Web应用框架,深受开发者喜爱,它简化了Java开发的复杂性,提供了强大的MVC(Model-View-Controller)架构,以及丰富的插件系统。这份用户手册将帮助你...

    eclipse开发grails插件

    对于Grails开发,我们需要的是Eclipse中的Grails插件,它能够提供对Grails项目的创建、运行、调试等一系列功能。 **Grails**是基于Groovy语言的全栈式Web开发框架,它借鉴了Ruby on Rails的设计理念,提供了快速...

    grails快速开发web

    ### Grails 快速开发 Web 应用程序 #### 一、Grails 概述 Grails 是一种基于 Groovy 的开源应用框架,用于简化 Web 应用程序的开发过程。它采用约定优于配置的原则,这使得开发者可以更快地创建功能丰富的 Web ...

    grails-2.4.4.zip

    《Grails 2.4.4 框架深度解析》 Grails 2.4.4 是一个基于Java的开源Web应用框架,它利用Groovy语言的强大特性,为开发者提供了一种高效、灵活的开发环境。这个压缩包“grails-2.4.4.zip”包含了完整的Grails 2.4.4...

    Grails中文参考手册

    **Grails 概述** Grails 是一个基于 Groovy 语言的开源 web 应用程序框架,它构建在 Java 平台上,旨在提高开发效率,简化常见 Web 开发任务。Grails 遵循 Model-View-Controller (MVC) 架构模式,允许开发者快速...

    Grails 的过滤器(Grails Filters)

    **Grails 框架与过滤器(Grails Filters)详解** Grails 是一个基于 Groovy 语言的、用于构建动态Web应用的开源框架。它提供了丰富的特性,简化了Java平台上的开发工作,如自动代码生成、元编程支持以及灵活的数据...

    grails中文参考手册

    《Grails中文参考手册》是针对Groovy编程语言构建的Web应用框架——Grails的一份详尽学习资料。Grails以其高效、灵活和强大的特性,成为开发人员在Java平台上构建Web应用的热门选择。这份手册旨在帮助初学者快速上手...

    Groovy和Grails配置方法

    ### Groovy和Grails配置方法 #### 一、Groovy与Grails简介 Groovy是一种强大的面向对象编程语言,它运行在Java平台上,并且能够直接与Java代码进行交互。Groovy支持函数式编程特性,拥有丰富的语法糖以及简洁的...

    eclipse插件grails(groovy)

    Eclipse 插件 Grails(Groovy)是一个强大的开发工具,它使得在Eclipse环境中进行Groovy和Grails应用的开发变得更为便捷。Groovy是一种动态、面向对象的编程语言,而Grails则是一个基于Groovy的开源Web应用框架,...

    grails login

    **Grails登录系统详解** Grails是一个基于Java的开源Web应用程序框架,它使用Groovy语言进行开发,提供了高效、简洁的编程模型。在Grails中实现用户登录功能是构建任何Web应用的基础,它确保了数据的安全性和用户...

    Grails入门指南 -- 针对grails1.0.4更新

    ### Grails入门指南知识点 #### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。它旨在简化开发过程,提高开发效率,尤其受到那些希望保留Java环境同时寻求更高效...

    the definitive guide to grails 2

    《Grails 2 的终极指南》是一本深入探讨Grails框架精髓的专业书籍,该书以英文撰写,旨在为读者提供全面、深入的Grails框架学习资料。Grails框架基于Groovy语言,是一种高度动态、敏捷的Java应用开发框架,它简化了...

Global site tag (gtag.js) - Google Analytics