您的位置:首页 > 数据库

如何通过程序实现同一事务中多次数据库更新的错误回滚?

2007-06-13 14:58 691 查看
具体情况是:


begin transaction //使用程序来完成对事务的控制。


// connect database


update the first row


// update successfully


update the second row


// fail to update due to connection lost.



这个时候我怎么实现Roll back 第一条更新的数据。

测试代码:


c.setAutoCommit(false);




PreparedStatement s = c.prepareStatement("insert into a values (?)");




Savepoint s1 = c.setSavepoint();




s.setString(1,"333");


s.executeUpdate();




Savepoint s2 = c.setSavepoint();




s.setString(1,"444");


s.executeUpdate();




Savepoint s3 = c.setSavepoint();




s.setString(1,"555");


s.executeUpdate();




c.rollback(s3);


c.commit();



在debug到更新444后,人工断掉数据库,再执行更新555,会报一个很熟悉的错误:
java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
再将数据库连上,查询A表,里面的数据为空,证明333和444都没有保存。其实只要setAutoCommit(false)的话,是不会存上的。oracle的savepoint是默认的,不用做任何操作;不过要是在sql中使用了when exception的话,情况就完全变了。

参考资料
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=42438&messageID=248011#248011
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: