事务保存点

保存点Savepoints

Savepoint接口提供了额外的事务控制

设置保存点时,可以在事务中定义逻辑回滚点,如果发生异常,则可以使用回滚方法来撤消所有更改或仅保存在保存点之前所做的更改

Connection对象有两种新的方法管理保存点 :

方法描述
setSavepoint(String savepointName)定义新的保存点,返回一个Savepoint对象
releaseSavepoint(Savepoint savepointName)删除保存点,tips:需要一个Savepoint对象作为参数,此对象通常是由setSavepoint()方法生成的保存点

代码示例:

在执行insert操作之后添加会抛出异常的语句System.out.println(1/0);使事务进行catch中的rollback操作,由于事务具有原子性,因此result1和result2都不执行,代码如下

public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        Savepoint savepoint1 =null;
        try {
            //1加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2获得链接
            String userName = "root";
            String passWord = "123456";
            String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT";
            connection = DriverManager.getConnection(url, userName, passWord);
            connection.setAutoCommit(false);//关闭自动提交事务
            //3定义sql,创建状态通道(进行sql语句的发送)
            statement = connection.createStatement();
            //4执行增删改查
            int result1 = statement.executeUpdate("insert into student values(10,'保存点1','3')");
            /*
            
            
            savepoint1 = connection.setSavepoint("Savepoint1");


			*/
            int result2 = statement.executeUpdate("insert into student values(11,'保存点2','3')");
            System.out.println(1/0);//通过异常让事务进行回滚,由于result1和result2属于同一个事务,因此都不执行
            connection.commit();//手动提交事务
            //返回结果为受影响的行数
            if(result1 > 0){
                System.out.println("执行成功");
            }else{
                System.out.println("执行失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
				connection.rollback();
				/*
				
				
                connection.rollback(savepoint1);//回滚到保存点
                connection.commit();//提交事务,即保存点之前的事务
                
                
                */
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }finally {
            try {
                //5关闭资源
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }//end finally
    }//end main

保存点可以在事务中定义回滚点,如果发生异常,使用回滚方法来保存在保存点之前所做的更改,即上述代码/**/注释部分

  • 在result1和result2之间定义回滚点savepoint1
savepoint1 = connection.setSavepoint("Savepoint1");
  • 异常处理的catch中设置回滚到保存点,并提交保存点之前的事务
//connection.rollback();

    connection.rollback(savepoint1);//回滚到保存点
    connection.commit();//提交事务,即保存点之前的事务

此时运行时虽然会抛出异常,但是成功提交保存点之前的事务,即result1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值