spring+hibernate,保存数据try并无异常,但是数据库就是没有该保存记录,这是怎么了

杨某某 发布于 2013/06/06 09:32
阅读 4K+
收藏 0

   首先得怪自己啊,学艺不精,最近项目问题太多了,什么都分析了,结果早上来一测试,跟踪日志发现服务器上的项目跟我开了个玩笑,如题,之前在OS也发帖寻求帮助,但是今天貌似该有结果了

   再陈述一下心酸史把!

   服务器上的项目5月份频繁出现各种不可理喻的异常(只是服务器,本地无,期间项目做了一次版本更新),在这之前半年难得遇到一次类似的情况(都怪自己大意没有及早解决),我从头到尾分析,只是代码多了但是配置没有任何变化,各种测试也用尽还是无法给出合理解释,希望今天的发现是问题的根结所在吧~~~

   出现的问题就是使用spring的HibernateTemplate做数据的保存,用jdbc查询,问题出在保存上,要是我没记错使用spring的该类再加上配置,事物这一块是可以自动提交的,但是我发现没有提交,也没有异常!!

   只是小弟我不明白有哪些因素可以直接影响到spring的事物管理,配置的问题还是别的?还有从启动tomcat到服务器出现这样的异常,前半段时间是正常的不会有这些,后半时间就出现这些了,而且问题还奇怪的是,后半时间如果多次执行这样的功能,其中还有那么几次是可以成功的!!!!

   分析到现在问题很明确了,spring的事物,谁在影响它???

   我还要分析,希望有朋友也能提提你的思路,多谢了...

   事物部分的配置如下:

  <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>


<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allServiceMethod" expression="execution(* com.test.etransaction.**.service.*Service.*(..))" />
<aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice" order="0" />
</aop:config>


<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="list*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="load*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="query*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="search*" propagation="NOT_SUPPORTED" read-only="true" />
<tx:method name="refresh*" propagation="NOT_SUPPORTED" read-only="true" />

<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

补充:

包路径是这样的com.test.etransaction.ood.service.impl

接口实现类写法是这样TestServiceImpl

写到这里我发现是不是我的这个<aop:pointcut id="allServiceMethod" expression="execution(* com.test.etransaction.**.service.*Service.*(..))" />写错了啊!!!???

该这样<aop:pointcut id="allServiceMethod" expression="execution(* com.test.etransaction.**.service.*.*(..))" />??

加载中
0
winnie_tour
winnie_tour

还一点题外话:假如你的更新操作出现exception,你的这个事务配置并不能起到作用,因为在配置中并没有rollback任何exception出来。

杨某某
杨某某
现在悲催了,项目编码的时候人员配置的原因,导致现在里面好多用到事物的地方被开发人员强行try catch了搞成了非运行时异常了,事物就无法回滚,伤人啊
杨某某
杨某某
这个说到点上了,真心感谢
0
不是小白
不是小白
开启事物了么?
杨某某
杨某某
回复 @铂金小白 : 呵呵,这里不好说啊,原来那个配置居然没报错,而且换个*号代替子包路径也可以,没搞懂
不是小白
不是小白
回复 @杨某某 : 对,你那个地方确实写错了。。。
杨某某
杨某某
回复 @铂金小白 : 贴上来了啊
不是小白
不是小白
@杨某某 你事物怎么配置的?贴出来让大家看看
杨某某
杨某某
项目使用的是声明式事务,正常情况下出现问题的那些持久数据的方法是可以的,理论上事物是开启了,但是特殊情况下就不能确定了,还在分析中,我指的特殊情况就是服务器运行的后半段时间
0
winnie_tour
winnie_tour
你用事务的目的是什么,没看懂。。
杨某某
杨某某
呵呵,就是在提交数据更新数据的时候用,你看里面传播特性的写法都是针对查询用的,查询为只读,save,与update等等全部要用到事物
0
程海峰
程海峰
相关的代码贴出来
0
winnie_tour
winnie_tour

我想我大概知道你的错误在哪了,第一点:请查看下expression="execution表达式的具体含义,第二点:既然sessionFactory交给事务管理,那么你的传播策略对所有get不支持,但是你没说insert或者update应该怎么样的策略呢?所以什么都没做

杨某某
杨某某
我现在就在测试第一点,第二点我说下,是这样的那配置里面我先把涉及到查询的单独罗列出来做配置为只读属性,其他的全部需要使用事物回滚
0
王瑞平
王瑞平

没保存上应该是回滚了

重点应该查查什么样的数据导致回滚

杨某某
杨某某
恩,数据应该没多大影响,测试过,每次提交相同的数据时而成功,时而失败,呵呵
0
杨某某
杨某某
问题解决了,哎,问题出在之前同事写的一个compass上,与SSH集成的,结果代码里面compass的事物和其session结束的方式不对,没有用try语句块结束导致一旦出现异常就有compass的session没关闭,然后就是一连串的增量索引出现各种奇怪的问题,苦逼啊!!!
返回顶部
顶部