论坛首页 入门技术论坛

Spring2.0 DataSourceTransactionManager 事务回滚问题

浏览 6651 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-04-10  
在使用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?
   发表时间:2007-04-10  
你看一下这个db类和DataSourceTransactionManager是否使用同一个datasource对象
0 请登录后投票
   发表时间:2007-04-10  
是bug的话也和spring没关系 ^_^
0 请登录后投票
   发表时间:2007-04-10  
呵呵,DataSource是一个,但是获取连接不是一个,我打出的Spring的日志,发现是两个连接对象:(

我因为使用ThreadLocal来传递数据库连接,如果连接在事务之外已经获得,则此连接无法再被事务使用。因此在事务启动之后,需要重新获得新的连接对象。
0 请登录后投票
   发表时间:2007-04-10  
看LZ的代码似乎没有问题。
这问题可真是奇怪。
要不你把那段(事务处理整个过程)的代码全部贴出来看看?
0 请登录后投票
   发表时间: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,就需要注意,必须在事务里面获得相应的数据库连接,除非你把你的数据库连接赋给事务。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics