`
jamesby
  • 浏览: 383445 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

为什么我的Spring的声明事务失效了?

阅读更多
DAO代码如下:

public class UserDAO extends BaseDAO {
public void insertTestData() {
Connection con = null;
PreparedStatement ps = null;
String sql = null;
try {
con = getConnection();
sql = "insert into oa_test_1(description) values(?)";
ps = con.prepareStatement(sql);
ps.setString(1, "TEST");
ps.execute();
String id = getIdentity(con);

if (1 == 1)
throw new RuntimeException();

sql = "insert into oa_test_2(description,parentid) values(?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, "TEST_2");
setIntParam(ps, new Integer(id), 2);
ps.execute();
} catch (SQLException e) {
throw new RuntimeException();
} finally {
safeCloseStatementOrRs(ps);
safeCloseConnection(con);
}
}
}



public class BaseDAO {
private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

public Connection getConnection() {
try {
return dataSource.getConnection();
} catch (Exception e) {
throw new RuntimeException();
}
}
}

Service 代码如下:
public class UserManagerService {

private UserDAO userDao;

public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}

public User userLogon(String username, String password) {
userDao.insertTestData();
return null;
}
}

Controller 代码如下:
public class PublicController extends MultiActionController {

private UserManagerService userService;

public void setUserService(UserManagerService userService) {
this.userService = userService;
}

public ModelAndView handleLogin(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
try {
userService.userLogon("james", "12345688");
//WebUtils.setSessionAttribute(request, "user", user);
return new ModelAndView(new RedirectView("/cm/index.htm"));
} catch (Exception e) {
System.out.println("transaction failed.........................");
}
return null;
}
}

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">


<jee:jndi-lookup id="dataSource" jndi-name="jndi_cm"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="userDao" class="com.cm.main.dao.UserDAO">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>

<bean id="userServiceTarget" class="com.cm.main.service.UserManagerService">
<property name ="userDao"><ref local="userDao"/></property>
</bean>

<bean id="userService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target"><ref local="userServiceTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">
PROPAGATION_REQUIRED,-Exception
</prop>
</props>
</property>
</bean>

<bean id="publicController" class="com.cm.main.controller.PublicController">
<property name="methodNameResolver"><ref local="cmMethodNameResolver"/></property>
<property name="userService"><ref bean="userService"/></property>
</bean>
</beans>

Spring 为2.0版本,appServer 为Weblogic 813
我很疑惑为什么我的声明事务控制失败,操作结果为oa_test_1中插入了一条记录,我明明已经抛出了RuntimeException,事务为什么不回滚,我的Service 和 Dao都没有实现接口方式,而是直接进行实现类的注入,不知道这是否有关系?

分享到:
评论
4 楼 sinoalex 2007-08-21  
不要自己抛异常,spring不知道那是什么异常,在catch中直接抛出原来的异常就可以了,如果想人为的话,我想也不应直接抛RuntimeException,换成DataAccessException试试。
3 楼 cnliuxj 2007-02-07  
希望你解决问题了,我也遇到类似的问题不知怎么弄
2 楼 jamesby 2006-12-13  
配置修改成:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="proxyTargetClass"><value>true</value></property>
<property name="transactionAttributes">
<props>
<prop key="user*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="userService" parent="txProxyTemplate">
<property name="target">
<bean class="com.cm.main.service.UserManagerService">
<property name="userDao"><ref bean="userDao"/></property>
</bean>
</property>
</bean>
还是不行

修改成
<bean id="matchAllWithPropReq" class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute" value="PROPAGATION_REQUIRED" />
</bean>

<bean id="matchAllTxInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributeSource" ref="matchAllWithPropReq" />
</bean>

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref local="matchAllTxInterceptor" />
</list>
</property>
<property name="beanNames">
<list>
<idref local="userService" />
</list>
</property>
</bean>
<bean id="userService" class="com.cm.main.service.UserManagerService">
<property name="userDao"><ref bean="userDao"/></property>
</bean>

还是失败,原来需要DataSourceUtils.getConnection(dataSource);方式取得数据库连接............
1 楼 jamesby 2006-12-13  
还是通过<jee:jndi-lookup id="dataSource" jndi-name="jndi_cm"/>得到的DataSource不可以?

相关推荐

    Spring事务管理失效原因汇总

    描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现问题,暴露了开发者对Spring事务机制不足够了解的问题。标签“Spring 事务 失效”直接概括了本文的知识点范围,即Spring...

    什么情况会导致@Transactional事务失效?

    在Java编程中,`@Transactional`注解是Spring框架提供的一种事务管理机制,它使得开发者能够在方法级别方便地声明事务边界。然而,在某些特定情况下,`@Transactional`可能会失效,导致事务无法正常工作。以下是一些...

    Spring自定义切面事务问题

    2. **Spring 自定义切面事务失效的原因** - 当我们创建自定义切面并通过`@Aspect`注解将其标记为切面时,如果没有正确地处理事务管理器和切面之间的关系,可能会导致事务失效。 - 默认情况下,Spring 的AOP代理...

    Spring的事务10种常见失效场景总结.zip

    1. **未开启事务**:如果在需要事务控制的方法中忘记添加`@Transactional`注解,Spring将不会自动进行事务管理,导致事务失效。记得在服务层方法上正确使用该注解,确保事务开始和结束。 2. **切面配置错误**:在...

    springtransaction 事务管理

    Spring事务管理主要包括编程式事务管理和声明式事务管理两种方式,使得开发者能够在不深入理解底层事务实现的情况下,轻松地在应用程序中管理事务。 1. **编程式事务管理**: 编程式事务管理是通过调用`...

    spring事务总结.docx

    然而,在实际开发过程中,经常会遇到一些关于Spring事务的问题,如事务失效、事务回滚、大事务问题以及编程式事务等。本文将深入探讨这些问题,并给出相应的解决方案。 #### 一、事务不生效的原因及解决办法 1. **...

    springAop事务配置

    在Spring框架中,AOP(面向切面编程)被广泛用于实现事务管理,因为它允许我们以声明式的方式处理事务,从而让业务代码更加简洁、易维护。本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1...

    Spring事务不生效.pdf

    如示例代码所示,如果一个@Transactional注解的方法被声明为private,Spring在检查方法访问权限时会判定其不支持事务,导致事务失效。 ```java @Service public class UserService { @Transactional private void...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    Spring 框架提供了两种事务管理机制:编程式事务管理和声明式事务管理。编程式事务管理需要手动编写事务管理代码,而声明式事务管理使用注解或 XML 配置来管理事务。 Spring+SpringMVC 配置事务管理无效原因 在...

    解决osgi spring 事务配置问题

    但在OSGi中,由于类加载器的隔离,Spring的代理机制可能会失效,导致事务无法正常工作。 为了解决这个问题,我们需要理解OSGi的类加载机制。每个bundle(类似于Java的jar包)都有自己的类加载器,这意味着类的实例...

    Spring之Spring2.5集成Hibernate3.6

    4. 在Spring配置文件中声明事务管理器和数据源。 5. 使用@Autowired注解将DAO注入到Service层。 6. 测试和调整配置,确保事务和缓存工作正常。 在压缩包文件“test_9”中,如果没有进一步的信息,我们无法确定它...

    Spring认证考试流程

    4. 事务(8%):涵盖了事务管理的策略,如编程式和声明式事务管理。 5. Security(6%):涉及Spring Security的基本概念,如授权、认证和过滤器链。 6. MVC(8%):考察Spring MVC框架的理解,包括控制器、视图解析...

    Spring In Action 随书源码

    3. **AOP**:Spring的AOP模块支持声明式事务管理、日志记录、性能监控等跨切面关注点,使得这些功能可以独立于业务逻辑进行实现和管理。 4. **数据访问**:Spring提供了JDBC抽象层,简化了数据库操作;还支持ORM...

    spring05-6

    Spring框架提供了一种强大的事务管理机制,允许开发人员声明式地控制事务边界。通过使用`@Transactional`注解,可以在方法级别指定事务的开始、提交和回滚条件。例如,当一个方法带有`@Transactional`注解时,Spring...

    这一次搞懂Spring事务注解的解析方式

    - 没有正确处理异常:未检查异常和受检查异常的处理不当可能导致事务失效。 通过理解这些核心概念和机制,我们可以更深入地掌握Spring事务注解的工作原理,避免在实际开发中遇到不必要的问题。

    spring

    5. spingAndJDBCforTransaction_23.rar:专门讨论Spring如何与JDBC一起处理事务管理,这是Spring的一个重要特性,允许开发者以声明式方式管理事务。 从这些文件名可以推断,压缩包内容可能包括了Spring的入门教程、...

Global site tag (gtag.js) - Google Analytics