0 0

hibernate乐观锁 StaleObjectStateException 疑惑10

我用的ssh2做的项目,事务是使用spring的事务代理 代理的service层,也使用了hibernate的乐观锁,

结果问题出来了,hibernate乐观锁是在事务提交的时候抛出的异常,但是那个时候service层的方法已经执行完了,所以spring抓不到异常

那么事务也就无法回滚,实际上异常只能在action层抓到,不知道我的理解有没有问题,还请大神们解答。

附上代码

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 指定满足哪些bean自动生成业务代理 --> <property name="beanNames"> <!-- 需要自动创建事务代理的bean --> <list> <value>payorderService</value> </list> <!-- 其它需要自动创建事务代理的bean --> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <!-- 可增加其它的interceptor --> </list> </property> </bean>

  payorderService代码:

 if (grouptzorderlistByRaftDay != null && grouptzorderlistByRaftDay.size() > 0) {

grouptzorderlistByRaftDay = mergeDayRaft(grouptzorderlistByRaftDay);

for (int j = 0; j < grouptzorderlistByRaftDay.size(); j++) {// 日控制 zt = new TZorderlist(); zt = (TZorderlist) grouptzorderlistByRaftDay.get(j); payorderDao.updateDayControl(orid, zt.getDtstartdate().substring(0, 10), zt.getItickettypeid().toString(), zt .getId().getIscenicid().toString(), zt.getZnumb().intValue()); } }

 payorderDao方法: public void updateDayControl(String orid, String date, String itickettypeid, String iscenicid, int numb) throws Exception { try { StringBuffer hql = new StringBuffer(); hql.append(" from Productcontrol where iscenicid=" + iscenicid + " and itickettypeid=" + itickettypeid + " and stdata='" + date + "' and controltype='02'"); List list = this.find(hql.toString()); Productcontrol p = null; if (list != null && list.size() > 0) { for (int j = 0; j < list.size(); j++) { p = (Productcontrol) list.get(j); p.setSoldnumber(p.getSoldnumber() + numb); this.update(p); } } } catch (Exception e) { System.out.println("=========>>hibernate 乐观锁 引起 事务异常"); e.printStackTrace(); throw e; } }


 就是这个方法里面Productcontrol 对象含有vision字段但是在这里未抛出 是否是在整个事务提交的时候,hibernate才去验证?

请打什么解答

 

 

2012年8月01日 17:44

1个答案 按时间排序 按投票排序

0 0

是否是在整个事务提交的时候,hibernate才去验证?


是的。提交时检查。

引用
所以spring抓不到异常

不应该。如果你另有excepiton的拦截器的话,是不是被它吃掉了。

引用
那么事务也就无法回滚[/]
不应该。能回滚。你可以看DB结果。

引用
实际上异常只能在action层抓到

你没有其他处理的话,是的。
通常会用个Exception拦截器干这个。如果这个拦截器能罩在service的最外层的话,就相当于在service捕捉了。

2012年8月16日 16:39

相关推荐

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    Hibernate悲观锁和乐观锁的实现

    在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...

    Hibernate的乐观锁与悲观锁

    ### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...

    Hibernate version 乐观锁 (xml方式)

    在了解了Hibernate乐观锁的XML配置后,我们可以结合源码进一步分析其实现细节。在Hibernate中,乐观锁的处理主要在`org.hibernate.event.internal.DefaultMergeEventListener`和`org.hibernate.event.internal....

    乐观锁version-练习

    2. **Hibernate的乐观锁机制**:了解Hibernate如何通过`version`字段实现乐观锁,包括`@Version`注解的使用、对象状态管理及冲突检测。 3. **乐观锁与悲观锁的区别**:对比两种锁的优缺点,例如悲观锁的资源消耗大...

    Hibernate中,利用版本管理机制来控制事务并发

    1. 版本号原理:Hibernate使用乐观锁策略,即假定在正常情况下,同一时间只有一个用户修改数据,当多个用户同时修改时,通过比较版本号判断是否有冲突。每个被管理的对象都有一个版本属性,每次更新对象时,...

    Hibernate.lock()方法中各种锁的区别.docx

    在Hibernate中,可以通过版本号检查来实现乐观锁。在数据库中添加一个`VERSION`字段记录版本号,读取数据时一起读取版本号,在更新数据时递增版本号,并对比版本号。 **Hibernate实现**: 首先在实体类中增加版本号...

    Hibernate update问题

    在更新过程中可能会遇到各种异常,如`StaleObjectStateException`表示并发冲突,`OptimisticLockingFailureException`表示乐观锁失败,应适当地捕获和处理这些异常,确保应用的健壮性。 总之,理解Hibernate的更新...

    一种基于hebernate乐观锁的信息系统开发模型 (2012年)

    标题中提到的“基于Hibernate乐观锁的信息系统开发模型”是一个工程技术领域的知识点,主要是关于信息系统开发方面的实践。Hibernate是一种流行的Java对象关系映射(ORM)框架,它用于将Java对象映射到数据库的表...

    hibernate错误汇总

    错误十:Exception in thread "main" org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 错误原因:这个异常通常发生在并发...

    hibernate各种操作

    Hibernate的`@Version`注解实现了乐观锁,防止并发问题。 总结,Hibernate为Java开发人员提供了丰富的工具和策略,简化了数据库操作,提高了开发效率。理解和掌握这些操作,将有助于更好地利用Hibernate进行数据库...

    hibernate_src

    8. 异常体系:Hibernate有自己的异常体系,如HibernateException、StaleObjectStateException等,这些异常可以帮助开发者定位和处理数据库操作中的问题。 通过对Hibernate源码的深入学习,我们可以了解其内部机制,...

    hibernate应用包

    4. 异常处理:熟悉Hibernate常见的异常,如ConstraintViolationException、StaleObjectStateException等,以便于调试和问题定位。 5. 日志配置:通过日志框架(如Log4j、SLF4J)设置合适的日志级别,便于跟踪和分析...

    hibernate04.zip

    Hibernate的异常体系主要基于`org.hibernate`包下的异常类,如`HibernateException`、`StaleObjectStateException`等。在编程过程中,应适当地捕获并处理这些异常,确保程序的健壮性。 总结,Hibernate与MySQL的...

    Hibernate3.2帮助文档

    - Hibernate抛出的异常如`ConstraintViolationException`, `StaleObjectStateException`等,需要适当地捕获和处理。 ### 结论 Hibernate 3.2作为Java ORM框架的杰出代表,通过其丰富的功能和易用性,大大简化了...

    Hibernate持久层方法汇总

    如果对象未被持久化,`update()`方法会抛出`StaleObjectStateException`。 6. `session.saveOrUpdate()`: - `saveOrUpdate()`方法是`save()`和`update()`的组合,它可以根据对象的状态自动决定是执行插入还是更新...

    hibernate3 最新教程 pdf

    常见的如ConstraintViolationException(违反约束条件)和StaleObjectStateException(脏数据异常)。 这个“Hibernate 3 最新教程”详细涵盖了以上各个主题,为初学者和进阶者提供了全面的学习资源。通过深入学习...

    hibernate中文开发手册详解

    《Hibernate中文开发手册详解》提供了全面的Hibernate学习资源,无论你是初学者还是有经验的开发者,都能从中找到解答疑惑的答案。通过深入理解并熟练运用Hibernate,你将在Java开发中更加游刃有余,实现高效的数据...

Global site tag (gtag.js) - Google Analytics