浏览 6651 次
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-10
//对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? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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,就需要注意,必须在事务里面获得相应的数据库连接,除非你把你的数据库连接赋给事务。 |
|
返回顶楼 | |