`
frank_cn
  • 浏览: 5200 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring2.0 DataSourceTransactionManager 事务回滚问题

阅读更多
在使用Spring的DataSourceTransactionManager过程中,系统发生第一次错误并进行回滚,可是已经提交的数据没有回滚,从第二次开始,系统发生错误后回滚就正常了。
//对Spring的事务简单封装,使用DataSourceUtil获得和释放链接。
TransactionManager manager = new TransactionManager ();
try{
  manager.begin();
  //添加用户
  db.execute("insert into USER(id, name) values(id, name)");
  //添加用户地址(填写地址过长,出错)
  db.execute("insert into ADDRESS(id, address) values(id, address)");
  manager.commit();
}catch(Exception ex){
  manager.rollback();
}

现象:
第一次提交失败时,系统回滚,但是用户信息已经插入。
第二次进行提交时,系统回滚,用户信息也被回滚。

测试环境:
Tomcat5 + C3P0(连接池) + DB2
Tomcat5 + C3P0(连接池) + MySQL
Weblogic + JNDI + DB2

现象都一致。

不知道大家是否碰到这样的问题?不知道如何解决?是否Spring的Bug?
分享到:
评论
5 楼 frank_cn 2007-04-11  
环境是这样的:
private static final ThreadLocal session = new ThreadLocal();
//DB使用线程同步
DB db = (DB)session.get();


在事务之前如果使用过DB,也就是在事务之前获得过连接,那么在db.execute()操作时,获得的连接还是线程池中的连接,而不是TransactionManager中新创建的连接;这样的话,如果操作不报错,数据更新等是对的,因为conn.getAutoCommit()是true;如果报错,就会有数据被回滚。

这个现象在使用Spring的JDBCTemplate或者TransactionTemplate里面不会出问题,因为连接是它创建好给你使用的。

如果单独使用Spring的Transaction,就需要注意,必须在事务里面获得相应的数据库连接,除非你把你的数据库连接赋给事务。
4 楼 hgq0011 2007-04-10  
看LZ的代码似乎没有问题。
这问题可真是奇怪。
要不你把那段(事务处理整个过程)的代码全部贴出来看看?
3 楼 frank_cn 2007-04-10  
呵呵,DataSource是一个,但是获取连接不是一个,我打出的Spring的日志,发现是两个连接对象:(

我因为使用ThreadLocal来传递数据库连接,如果连接在事务之外已经获得,则此连接无法再被事务使用。因此在事务启动之后,需要重新获得新的连接对象。
2 楼 shaucle 2007-04-10  
是bug的话也和spring没关系 ^_^
1 楼 zdbjava 2007-04-10  
你看一下这个db类和DataSourceTransactionManager是否使用同一个datasource对象

相关推荐

    Spring2.0 事务处理

    Spring 2.0版本在事务处理方面做了许多改进,使得开发者能够更有效地管理应用程序的事务边界。这篇博客将深入探讨Spring 2.0中的事务处理机制,以及如何通过`applicationContext.xml`配置文件来设置和管理事务。 ...

    Spring2.0的配置

    本文将详细介绍Spring 2.0的声明式事务配置以及如何简化这一过程。 首先,Spring提供了多种事务管理器,以适应不同的持久层技术和环境。对于单一资源,可以选择如DataSourceTransactionManager(适用于JDBC)、...

    Spring 2.0 开发参考手册

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    在基于Struts1.2和Spring2.0的架构中,通常会将`@Transactional`应用于Service层的方法,而Controller层负责接收请求并调用Service层。JDBC则用于与数据库进行交互。这样,事务的边界就被定义在Service层,确保了...

    spring事务支持

    这些规则可以指定哪些方法需要在事务中执行,以及哪些异常会导致事务回滚。Spring的事务配置元信息结合`PlatformTransactionManager`和`TransactionInterceptor`,生成一个AOP代理,从而实现事务的自动管理。 配置...

    struts2.0总结

    接下来,Spring配置了事务管理器(TransactionManager),它是`org.springframework.jdbc.datasource.DataSourceTransactionManager`,该类使用指定的数据源进行事务管理。接着定义了一个名为`txAdvice`的事务建议,...

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

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...

    JSP 中spring事务配置详解.docx

    如果发生任何异常,Spring会自动回滚事务,确保数据一致性。 总的来说,Spring在JSP中的事务配置主要是通过XML配置文件完成的,包括数据源设置、事务管理器配置以及启用基于注解的事务管理。这种方式极大地简化了...

    spring chm文档

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    mybatis整合spring

    4. **配置事务管理器**:Spring 需要一个 PlatformTransactionManager 来管理事务,对于 MyBatis,通常是使用 DataSourceTransactionManager。配置完成后,Spring 就能接管 MyBatis 的事务控制。 5. **Mapper 配置*...

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

Global site tag (gtag.js) - Google Analytics