我在测试事务是不是回滚的时候,我这样写的代码
我在业务层的一个方法中加了这2行代码
frameSubsysDAO.update(frameSubsys);
throw new RuntimeException("aaaaaa");
这个方法我没有用
try cathc{} 而
frameSubsysDAO.update(frameSubsys);调用的dao方法是这样写的 public void update(Object instance)
{
log.debug("update instance");
try
{
getHibernateTemplate().update(instance);
log.debug("update successful");
}
catch(RuntimeException e)
{
log.error("update failed", e);
throw e;
}
}
我怀疑这里因为加了
try catch{}才导致事务不能回滚,请问是不是哦?
我在业务层的一个方法中加了这2行代码
frameSubsysDAO.update(frameSubsys);
throw new RuntimeException("aaaaaa");
这个方法我没有用
try cathc{} 而
frameSubsysDAO.update(frameSubsys);调用的dao方法是这样写的 public void update(Object instance)
{
log.debug("update instance");
try
{
getHibernateTemplate().update(instance);
log.debug("update successful");
}
catch(RuntimeException e)
{
log.error("update failed", e);
throw e;
}
}
我怀疑这里因为加了
try catch{}才导致事务不能回滚,请问是不是哦?
http://blog.csdn.net/kuangmiao1120/archive/2008/05/29/2493776.aspx
<tx:attributes>
<tx:method name="insert*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="delete*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="update*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="exchange*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="*" read-only="true" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<!--
配置那些类的方法进行事务管理,当前net.omw.flow.bo.impl包中的子包, 类中所有方法需要,还需要参考tx:advice的设置
-->
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(*
net.omw.flow.bo.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
</aop:config>
<bean id="powerMessage" class="net.omw.pub.manager.PropertiesManager">
<property name="resource">
<value>/WEB-INF/classes/power.properties</value>
</property>
</bean>
这是我配置的事务
我现在就是回滚不了,我现在就是怀疑是不是
public void update(Object instance)
{
log.debug("update instance");
try
{
getHibernateTemplate().update(instance);
log.debug("update successful");
}
catch(RuntimeException e)
{
log.error("update failed", e);
throw e;
}
}
加了try catch{}
的缘故
但是我在dao层加了try catch
我想问下,是不是这个地方出了错误哦?
tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="delete*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="update*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="exchange*" read-only="false" propagation="REQUIRED"
isolation="SERIALIZABLE" />
<tx:method name="*" read-only="true" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<!--
配置那些类的方法进行事务管理,当前net.omw.flow.bo.impl包中的子包, 类中所有方法需要,还需要参考tx:advice的设置
-->
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(*
net.omw.flow.bo.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
</aop:config>
我事务-配置在业务层的
frameSubsysDAO.update(frameSubsys);
throw new RuntimeException("aaaaaa");
这两行代码也是在业务层呀
按理说,程序运行到
throw new RuntimeException("aaaaaa");会抛异常
导致事务回滚,数据不会被更新,但是,我现在的情况是数据被更新了,不符合我的愿望哦
据我所知,mysql的诸多存储引擎中,就有好几个是不支持事务的。
一般支持事务的数据库,rollback和commit都是事务的基本操作,应该都支持的。