我在spring设置了事务管理,但是对于需要使用事务的方法,如果不手动开启事务,这个方法根本不执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在spring设置了事务管理,但是对于需要使用事务的方法,如果不手动开启事务,这个方法根本不执行相关的知识,希望对你有一定的参考价值。

我在spring设置了事务管理,但是对于需要使用事务的方法,如果不手动开启事务,这个方法根本不执行,如session.delete().,也就是数据根本没有删除。加上了手动开启、提交事务就可以。
代码如下:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- 配置事务管理 -->
<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 通知 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>

<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="all" expression="execution(* com.cstp.service.*.*

(..))"/>
<!-- 加入切入点,和通知配置 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="all"/>
</aop:config>
<!-- dao -->
<bean id="user1DAO" class="com.cstp.impl.User1Impl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- service -->
<bean id="user1Service" class="com.cstp.service.User1ServiceImpl">
<property name="user1DAO" ref="user1DAO"/>
</bean>

<!-- action -->
<bean id="user1Action" class="com.cstp.action.User1Action">
<property name="user1Service">
<ref bean="user1Service"/>
</property>
</bean>
</beans>

public class User1ServiceImpl implements User1Service
//xml文件中的依赖注入,property="user1DAO"
private User1DAO user1DAO;

public boolean deleteUser(String userid)
return user1DAO.deleteUser(userid);



public class User1Impl extends HibernateDaoSupport implements User1DAO

public boolean deleteUser(String userid)
Session session=null;
//Transaction tr=null;
try
session=this.getHibernateTemplate().getSessionFactory().openSession();
//tr=session.beginTransaction();

User1 user=(User1) session.get(User1.class, userid);
session.delete(user);
//tr.commit();
return true;
catch (HibernateException e)
e.printStackTrace();
/*if(tr!=null)
tr.rollback();
*/
return false;
finally
if(session!=null)
session.close();




省略了接口,serivce接口调用实现类,实现类中有调用了user的接口,从而调用到实现类

你这用的是hibernate吧。。这和spring没多大关系吧。。hibernate不会自动提交事务的。是手动提交的。你不提交事务。他只是在缓存中而已。不会持久化的。 参考技术A <bean id="user1Service" class="com.cstp.service.User1ServiceImpl">你的service没有impl包
那你上面定义切入点的时候就多了一个 * ,你去掉试试!
<aop:pointcut id="all" expression="execution(* com.cstp.service.*(..))"/>

或者你先直接把切入点定义在dao层试试!
参考技术B <bean id="user1Service" class="com.cstp.service.User1ServiceImpl">你的service没有impl包
那你上面定义切入点的时候就少了一个 点,你去掉试试!
<aop:pointcut id="all" expression="execution(* com.cstp.service..*.*(..))"
参考技术C 哥哥,我想说你事务方法写了?aop类写了吗?

以上是关于我在spring设置了事务管理,但是对于需要使用事务的方法,如果不手动开启事务,这个方法根本不执行的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务管理那些事

Spring事务管理

spring事务不生效原因

spring事务不生效原因

Spring事务详解

事务理解及Spring中的事务