精华内容
下载资源
问答
  • 2020-05-10 16:25:28

    保存点

    ①语法

    savepoint  保存点名称;
    

    ②配合使用rollback 可以完成事务,数据回退到指定保存点

    rollback to 保存点名称;
    rollback; -- 取消全部事务
    

    ③ 一个事务中可以设置多个保存点
    ④ 一旦回退或提交了,就不能回退了。
    ⑤ 设置保存点会有资源开销。

    更多相关内容
  • 主要介绍了Java的JDBC使用中设置事务回滚的保存点的方法,JDBC是Java用于连接各种数据库的API,需要的朋友可以参考下
  • 文章目录JDBC事务事务的提交和回滚保存点Savepoints 有关事务的相关知识可阅读文章:SQL完整性、多表查询及事务 JDBC事务 事务能够控制是否和何时更改应用于数据库,将单个SQL语句或一组SQL语句视为一个...


    有关事务的相关知识点可阅读文章:SQL完整性、多表查询及事务

    JDBC中的事务

    事务能够控制是否和何时更改应用于数据库,将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,则整个事务将失败

    JDBC驱动程序默认使用自动提交模式,每个SQL语句在完成后都会提交到数据库

    • 启用手动事务支持:
      使用Connection对象的setAutoCommit()方法
      如果将boolean false传递给setAutoCommit()则关闭自动提交,可以通过传递布尔值true重新打开它

    事务的提交和回滚

    事务默认使用自动提交模式

    启用手动事务支持:

    • 将false传递给setAutoCommit()关闭自动提交
    connection.setAutoCommit(false);//关闭自动提交事务
    
    • 完成更改后,在连接对象上调用commit()方法提交事务
    connection.commit();//手动提交事务
    
    • 如果不提交事务或者发生错误,则进行回滚更新
    connection.rollback();
    

    代码示例:

     public static void main(String[] args) {
            Connection connection = null;
            Statement statement = 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 result = statement.executeUpdate("insert into student values(9,'哈哈','3')");
                connection.commit();//手动提交事务
                //返回结果为受影响的行数
                if(result > 0){
                    System.out.println("执行成功");
                }else{
                    System.out.println("执行失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    connection.rollback();//如果出现异常,则回滚
                } 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
        }
    

    某些业务逻辑需要同时成功or同时失败,因此需要设置手动提交事务,此时某些业务发生异常后不能进行事务提交,这是事务的意义

    该事务案例可阅读文章:JDBC事务案例——转账


    保存点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


    展开全文
  • MySQL事务保存点

    千次阅读 2021-01-09 20:18:20
    粗略来讲相当于Java的“断点”,设置一个断点,当你数据库插入一条数据后,这条语句后面设置一个savepoint,当你需要rollback的时候,只需要回滚到这个savepoint时就可以,这样就节省了大量的时间,提高的...

    当你在数据库插入大量语句后,突然其中一句报错,rollback大量数据的效率极低,如何解决?

    一:我们在这里提出一个事务“保存点”的概念

    那什么是保存点?粗略来讲相当于Java中的“断点”,设置一个断点,当你在数据库中插入一条数据后,在这条语句后面设置一个savepoint,当你需要rollback的时候,只需要回滚到这个savepoint点时就可以,这样就节省了大量的时间,提高的工作效率,也不需要消耗过多的数据库的资源。

    二:代码演示

    我的数据库表有cid cname pid三个属性,用sql语句插入

    1. 首先开启事务
    START TRANSACTION;
    
    INSERT into city VALUES(NULL,"武汉市","7");
    

    插入成功后,我们在这设置一个保存点a

    SAVEPOINT a;
    
    INSERT into city VALUES(NULL,"北京市","8");
    

    插入成功后,我们在这设置一个保存点b

    SAVEPOINT b;
    
    INSERT into city VALUES("南京市","9");
    

    这边sql语句出现错误

    INSERT into city VALUES("南京市","9")
    > 1136 - Column count doesn't match value count at row 1
    > 时间: 0s
    
    

    5.这边我们用保存点进行回滚

    rollback to SAVEPOINT a;
    

    回滚到a成功

    rollback to SAVEPOINT a
    > OK
    > 时间: 0s
    

    在插入大量数据中间发生错误需要回滚,就可以利用保存点的方法来有效的解决此类问题,希望对你们有帮助!

    展开全文
  • 事务保存点(savepoint)

    千次阅读 2020-06-25 16:04:05
    开启事务执行语句后面打几个,我们调用rollback语句就会回滚到指定的。而不是回到事务执行之前的样子。 定义保存点的语法如下: SAVEPOINT 保存点的名称; 当我们想回滚到某个保存点时,可以使用下边的...

    如果开启一个事务,已经写了很多语句,突然发现执行完上一语句时发现语句写错了。你只好使用rollback语句让数据库恢复到事务开启之前的状态。以前写完的语句也需要重新执行。所以mysql数据库的作者提出了保存点(savepoint)的概念。开启事务后在执行语句后面打几个点,我们调用rollback语句就会回滚到指定的点。而不是回到事务执行之前的样子。

    定义保存点的语法如下:

    SAVEPOINT 保存点的名称;

    当我们想回滚到某个保存点时,可以使用下边的语句。(WORK和SAVEPOINT可有可无)

    ROLLBACK [WORK] TO [SAVEPOINT]

    不过如果rollback后面不跟保存点的名称,事务就会回滚到执行之前的状态。

    如果想删除某个保存点可以使用下面的语句。

    RELEASE SAVEPOINT 保存点名称;

    下面举个例子来说明保存点的用法。张三向猫爷转账2块钱。在执行完扣除张三2块钱处打一个保存点。

    select * from account;
    idnamebalance
    1狗哥11
    2猫爷2
    3张三10

     

     

     

     

     

    #开启事务
    begin;
    
    update account set balance =balance-2 where id=3;
    
    
    savepoint s1; #一个保存点
    
    
    select * from account;
    
    
    idnamebalance
    1狗哥11
    2猫爷2
    3张三8

     

     

     

     

     

     UPDATE account SET balance = balance + 1 WHERE id = 2; #更新错了

    回滚事务到保存点;

    rollback to s1; #回滚到保存点
    
    
    select * from account;
    idnamebalance
    1狗哥11
    2猫爷2
    3张三10
    展开全文
  • 事务原理及流程,保存点的使用

    千次阅读 2018-11-05 10:50:12
    一、事务概述 : 1.事务由一系列的相关的sql语句组成的最小逻辑工作单元  2.oracle以事务为单位来处理数据,保证数据的一致性  3.如果对事务进行提交,该事物的所有sql语句操作都会提交,成为数据库的永久组成...
  • 用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的。回退事务的几个重要操作1.设置保存点 savepoint a2.取消保存点a之后事务 rol...
  • 编写业务的过程,会需要进行事务处理,当需要执行多条插入语句时,如果前几条成功,而最后一条失败,那么我们需要回滚数据库操作,保持数据的一致性和完整性,此时,就需要利用DB的事务处理。事务是恢复和并发...
  • 保存点可以回退到事务的一部分,我们操作数据库的过程可以对事务分隔为几个部分,操作失误的时候就可以回滚到某个即可。 a、我们现在新建一张表empt: create table empt( "id" number, "text" varchar...
  • from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic import Viewfrom django.db import transaction # 导入事务 # 类视图 (事务,@transaction.atomic装饰器)...
  • 保存点事务处理过程的一个标志,与回滚命令结合使用。其主要用途是允许用户将某一段处理进行回滚而不必回滚整个事务。 --首先创建一个表 create table library( title VARCHAR2(50), author VARCHAR2(20), ...
  • 手动开启事务/保存点/隐式发出commit的语句 1.手动开启事务 @Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition; ...
  • 解释数据库中事务作用事务是一系列的数据库操作,是数据库应用的基本逻辑 单位。...事务正确提交后,其结果将永久保存在数据,即使在事务提交后了其他故障,事务的处理结果也会得到保存。 ...
  • 在事务方法调用另外一个事务... service层两个事务方法insertUser1、insertUser2, 当insertUser1调用insertUser2是,如果前面 方法异常,后边方法不会保存  期望:不管insertUser1是否报错,insertUs...
  • oracle:SAVEPOINT(保存点)

    千次阅读 2018-08-18 15:54:03
    保存点(SAVEPOINT)是事务处理过程的一个标志,与回滚命令(ROLLBACK)结合使用。其主要用途是允许用户将某一段处理进行回滚而不必回滚整个事务。 1)执行SAVEPOINT SAVE_A的时候创建了一个保存点SAVE_A; ...
  • 知识PL/SQL语句块使用DML语句的基本知识,包括select into、insert、update、delete等操作。事务处理的掌握,理解提交、回滚、保存点等概念。 1、什么是DML(知识回顾) SQL语言是针对数据库而言的...
  • 一、Java事务 1、通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity...事务的隔离性:表示在事务执行过程对数据的修改,在事务提交之前对其他事务不可见。 事务
  • 最近的SpringBoot项目使用了Spring Data JPA,遇到了一个奇怪的问题,方法使用@Async标注以后,可以异步运行,但是运行时使用@Transactional标注的方法,不能保存数据,打印SQL语句,发布只有SELECT语句,UPDATE...
  • 数据库事务什么?

    千次阅读 2021-07-28 20:59:24
    如果组的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将...
  • 作用 保存点可以回退到事务的一部分,我们操作数据库的过程可以对事务分隔为几个部分,操作失误的时候就可以回滚到某个即可。 实现步骤 我们现在新建一张表TMP003 CREATE TABLE TMP003(ID NUMBER,"DESC...
  • 1.事务(Transaction)是并发控制的基本单位。 所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。...事务是数据库维护数据一致性的单位,每个事务结束时,...
  • 事务在什么情况下会失效

    千次阅读 2020-07-29 18:36:50
    所以必须service捕获异常,然后再次手动 throw 一个非检查型异常,这样事务方才起效。 方法名前面:@Transactional try{ ………… } catch (Exception e) { ………… throw new RuntimeException(e)...
  • java的Session有什么作用

    千次阅读 2021-02-13 01:10:33
    因为HTTP协议是无状态的协议,但我们需要保存客户端多次请求之间状态信息的时候,我们需要Session来维护客户端的状态。Session对象类似于一个服务器端的容器,可以存放任何对象,以供不同页面间共享数据。Session...
  • 什么事务事务隔离级别

    千次阅读 2021-05-07 10:45:22
    什么事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性...
  • 数据库事务实现原理

    2021-02-02 03:58:33
    微信公众号:云计算通俗讲义持续输出技术干货,欢迎关注!...数据库提交工作时,可以保证要么所有修改都保存了,要么所有修改都不保存(事务是数据库区别于文件系统的重要特征之一)。说明:1、每个SQL语句都是...
  • 事务与死锁

    2019-02-26 21:20:11
    session 会话,以此概念表示唯一的一个用户,oracle每一个登录到数据库的用户,都会自动分配一个session session 会话,以此概念表示唯一的一个用户,oracle每一个登录到数据库的用户,都会自动分配一个...
  • MySQL-事务

    千次阅读 2020-12-01 14:59:32
    文章目录事务课前题目一、事务的含义二、特点(ACID)三、事务的使用步骤 ★3.1 隐式(自动)事务:3.2 使用显式事务① 开启事务② 编写一组逻辑sql语句③ 设置保存点④ 结束事务结束事务回滚:rollback3.3 使用案例...
  • 文章目录事务不生效方法内部调用修复方法一 : 【新加一个Service方法】修复方法二:【该Service类注入自己】修复方法三:【通过...时候我们需要某个Service类的某个方法,调用另外一个事务方法 @Service p
  • PostgreSQL之事务

    2020-12-16 12:53:31
    PostgreSQL,通过SQL命令使用BEGIN和COMMIT命令设置事务。所以上例的银行事务应该如下: BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; -- etc etc COMMIT; 如果,在事务...
  • 我有一个调用同一服务的其他事务方法的非事务性和异步...这个例子,要调用保存播放器服务的方法,事务保存播放器。@Service@Transactional(readOnly = true)public class PlayerServiceImpl implements Player...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,696
精华内容 72,678
关键字:

如何在事务中设置保存点,保存点有什么用途