当前位置:首页 > spring trascation
2Hibernate和JDBC混合使用注意事项
由于Hibernate一级缓存的原因,在通过save,update,delete等方法操作数据
时,并没有真正向数据库发送SQL,只有调用flush()时,Hibernate才会将一级缓存中的状态变化同步到数据库中。
Hibernate的事务管理在提交事务时,会自动调用flush()操作,将一级缓存同步到数据库中,此时才会将产生并向数据库发送SQL语句。
正是因为以上原因的存在,所有在混合使用JDBC和Hibernate时,可能存在丢失更新的问题。
在混合使用Hibernate和JDBC时,JDBC的操作不会同步到Hibernate的缓存中(一级缓存及二级缓存),Hibernate缓存中的状态变更也不被JDBC感知。因此混合使用时必须特别关注这一点。
由于混合数据访问技术的方案的事务同步而缓存不同步的情况,所以最好用Hibernate完成读写操作,而用Spring JDBC完成读的操作。如用Spring JDBC进行简要列表的查询,而用Hibernate对查询出的数据进行维护。如果确实要同时使用Hibernate和Spring JDBC读写数据,则必须充分考虑到Hibernate缓存机制引发的问题:必须充分分析数据维护逻辑,根据需要,及时调用Hibernate的flush()方法,以免覆盖Spring JDBC的更改,在Spring JDBC更改数据库时,维护Hibernate的缓存。
3Spring的事务增强限制条件
由于Spring事务管理是基于接口代理或动态字节码技术,通过AOP实施事务
增强的。
对于基于接口动态代理的AOP事务增强来说,由于接口的方法是public的,这就要求实现类的实现方法必须是public的(不能是protected,private等),同时不能使用static的修饰符。所以,可以实施接口动态代理的方法只能是使用“public”或“public final”修饰符的方法,其它方法不可能被动态代理,相应的也就不能实施AOP增强,也即不能进行Spring事务增强了。
基于CGLib字节码动态代理的方案是通过扩展被增强类,动态创建子类的方式进行AOP增强植入的。由于使用final,static,private修饰符的方法都不能被子类覆盖,相应的,这些方法将不能被实施的AOP增强。所以,必须特别注意这些修饰符的使用,以免不小心成为事务管理的漏网之鱼。
4Spring事务管理的异常捕捉,事务回滚
spring的事务管理器只对 unchecked exception进行异常回滚,Error和RuntimeException及其子类是unchecked exception.其他exception是checked exception.
如果在service层中,使用了try ,catch来捕捉异常,导致sevice层出现的异常被 “截留”,无法抛出给事务管理器,这就给事务管理器造成一种假象,就像程序在运行中,没有产生任何问题,因此也就不会对出现 runtimeException进行回滚操作。
文章来自于网上资源整理,自己经过demo测试 友情链接:
《Spring 3.x企业实用开发实战》作者博客http://stamen.iteye.com/ca
共分享92篇相关文档