如何通过程序实现同一事务中多次数据库更新的错误回滚?
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
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
相关文章推荐
- 关于error C2471:无法更新程序数据库的错误的解决方法
- python_如何通过twisted实现数据库异步插入?
- 数据库中,什么是事务,可以简述,事务机制如何实现的吗
- JAVA中处理事务的程序--多条更新SQL语句的执行(包括回滚) .
- 当一个数据库插入事务由于错误被回滚时,被插入表中标识字段的值该发生怎么样的变化?
- 如何在PHP中通过ADO调用Asscess数据库和COM程序
- 如何在PHP中通过ADO调用Asscess数据库和COM程序
- 通过程序实现数据库主键累积增长的方法
- JAVA中处理事务的程序--多条更新SQL语句的执行(包括回滚)
- 如何使用 Visual C# 2005 或 Visual C# .NET 通过 DataSet 对象更新数据库
- 关于android程序自动更新功能的实现,如何去除安装提示
- 如何实现表单一次上传多表数据并更新到数据库
- 问题:如何通过触发器实现数据库的即时同步?
- 问题的提出:如何在Windows上通过终端程序实现Unix平台的前台编译?
- 如何解决R6034错误,实现在WIN7以上版本通过LoadLibrary加载msvcr90.dll等DLL
- winform程序如何通过操作注册表来实现限制使用次数
- python如何通过twisted实现数据库异步插入
- JAVA中处理事务的程序--多条更新SQL语句的执行(包括回滚)
- 如何通过设计数据库实现外键的级联删除???答: