JDBC处理事务的保存点

先上代码,(此代码参考传智播客李勇老师的JDBC视频)。

/**
 * @ Title: JDBC_ACID1.java
 * @ Package: com.ynsf.web.test
 * @ Description: TODO
 * @ Author: huangyuze
 * @ Date: Oct 10, 2013 11:14:24 PM
 * @ Version V1.0
 */
package com.ynsf.web.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;

import org.junit.Test;

import com.ynsf.web.dbutil.DataBaseConnection;

/**
 * @ ProjectName: MyFirstWeb
 * @ PackgeName: com.ynsf.web.test
 * @ ClassName: JDBC_ACID1
 * @ Description: 事务的保存点处理(回滚到保存点)
 * @ Author: huangyuze
 * @ Date: Oct 10, 2013 11:14:24 PM
 * @ Version: V1.0
 */
public class JDBC_ACID1 {

    private Connection conn = null;
    private ResultSet rs = null;
    private Statement st = null;
    DataBaseConnection dbc = new DataBaseConnection();
    Savepoint sp = null;
    
    @Test
    public void test(){
        
        this.conn = this.dbc.getDBS();//取得数据库资源
        String sql1 = "UPDATE jdbc_acid SET money = money + 1000 WHERE name = '张三'";
        String sql2 = "SELECT money FROM jdbc_acid WHERE name = '李四'";
        String sql3 = "UPDATE jdbc_acid SET money = money - 1000 WHERE name = '李四'";
        String sql4 = "UPDATE jdbc_acid SET money = money + 2000 WHERE name = '王武'";
        try {
            
            this.conn.setAutoCommit(false);//打开事务
            this.st = this.conn.createStatement();

           this.st.executeUpdate(sql1);
            //设置事务保存点
(1) sp = this.conn.setSavepoint();
            
            this.rs = this.st.executeQuery(sql2);
            
            float money = 0.0f;
            while(rs.next()){
                
                money = rs.getFloat(1);
            }
            if(money < 6000){
                
                throw new RuntimeException("已超过最大限额。");
            }else{
                
                this.st.executeUpdate(sql3);
            }
            
            this.st.executeUpdate(sql4);//更新王武的数据
            
(2)       this.conn.commit();//提交事务
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            if(this.conn != null && this.sp != null){
                
                try {
                    this.conn.rollback(sp);//回滚
                    this.conn.commit();
                } catch (RuntimeException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (SQLException x) {
                    // TODO Auto-generated catch block
                    x.printStackTrace();
                }
            }

        }catch(SQLException e2){
            
            if(this.conn != null){
                try {
                    this.conn.rollback();
                } catch (SQLException e3) {
                    // TODO Auto-generated catch block
                    e3.printStackTrace();
                }
            }
        }
        finally{
            
            if(rs != null){
                
                try {
                    this.rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(st != null){
                
                try {
                    this.st.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            this.dbc.closeDBS();
        }
    }
}




1、在JDBC中,可以使用保存点技术,对一个事物中的处理进行部分处理。

2、在(1)处设置保存点,保存点以后的代码中,若出现异常,则进行回滚,但是只回滚到保存点,而保存点之前的代码是执行的,虽然他们在同一个事物中,以此实现事物部分处理。

3、保存点技术总结:

     A、this.conn.setAutoCommit(false); 设置成不自动提交。

     B、中间设置保存点。

     C、出现异常,回滚到设置的保存点。

     D、this.conn.commit(); 提交事物

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值