浏览 2174 次
|
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-04-10 关键字: Spring Transaction
在使用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? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-10
你看一下这个db类和DataSourceTransactionManager是否使用同一个datasource对象
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-10
是bug的话也和spring没关系 ^_^
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-10
呵呵,DataSource是一个,但是获取连接不是一个,我打出的Spring的日志,发现是两个连接对象:(
我因为使用ThreadLocal来传递数据库连接,如果连接在事务之外已经获得,则此连接无法再被事务使用。因此在事务启动之后,需要重新获得新的连接对象。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-10
看LZ的代码似乎没有问题。
这问题可真是奇怪。 要不你把那段(事务处理整个过程)的代码全部贴出来看看? |
|
| 返回顶楼 | |
|
最后更新时间: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,就需要注意,必须在事务里面获得相应的数据库连接,除非你把你的数据库连接赋给事务。 |
|
| 返回顶楼 | |






