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

 
具体情况是:
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的话,情况就完全变了。
 
参考资料

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值