• 柔软的胖
    2019-07-13
    set autocommit=0;
    BEGIN;
    INSERT INTO test1 VALUES ('a') ;
    BEGIN;
    INSERT INTO test1 VALUES ('b');
    INSERT INTO test1 VALUES ('b');

    在上面代码中,第一个BEGIN没有显示提交。在执行第二个BEGIN时,自动把第一个事务提交了。请问这是MYSQL中默认的行为吗?
    展开

    作者回复: 对的,在MySQL中,如果是连续BEGIN,开启了第一个事务,还没有进行COMMIT提交,而直接进行第二个事务的BEGIN,数据库会隐式的帮助COMMIT第一个事务,然后进入到第二个事务

    
     17
  • 庞鑫华
    2019-07-25
    老师,什么时候能讲一下redo,undo log

    作者回复: 我记得专栏后面章节里有讲到过,可以看看

    
     5
  • 夜路破晓
    2019-07-12
    事务是个有理想、有个性、讲爱憎的耿直BOY。跟这样的人打交道会很放心。

    作者回复: 可以这么理解,要么全部执行,要么全部不执行。不过实际操作的时候,还需要使用COMMIT和ROLLBACK来管理我们的事务

    
     3
  • 毛豆
    2019-07-12
    为什么一直重点在讲Mysql呢,oracle只是随口一提,而且oracle是有自动提交的,例如像create语句,oracle是自动提交

    作者回复: 目前是围绕一个RDBMS来做举例,顺便举例下Oracle和SQL Server的不同,这些不同我回来再做个详细的整理,放到进阶篇中

     2
     3
  • Ant
    2019-07-12
    老师能不能穿插着一些工作环境中的实例来介绍呢?比如说事务的自动提交,生产当中我们要设置成自动提交还是不自动提交,是基于什么样的情况下才这样设计,这样就更容易理解了~,一个小建议

    作者回复: 感谢Ant同学

    
     3
  • 演
    2019-07-17
    CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB;
    BEGIN;
    INSERT INTO test SELECT '关羽';
    COMMIT;
    INSERT INTO test SELECT '张飞';
    INSERT INTO test SELECT '张飞';
    ROLLBACK;
    SELECT * FROM test;

    老师 后面两次插入张飞不在一个事务里是什么意思?这两次插入前面也没有begin
    展开
     2
     2
  • 时间是最真的答案
    2019-07-12
    不知道作者在什么样的环境下操作的,我实验结果和你的不一样;
    我的 MySQL8.0,使用 Navicat 12 操作的,实验结果都不一样
    第一个实验,数据库中插入两条数据:关羽,张飞
    第二个实验,数据库中插入两条数据:关羽,张飞
    第三个实验,数据库中插入一条数据:关羽
    麻烦老师回复一下
    展开

    作者回复: 采用默认的autocommit=1;
    第一个实验后面那个应该是ROLLBACK,和后面的实验都一样,最后一个操作应该是ROLLBACK。所以结果:
    实验1:关羽
    实验2:关羽,张飞
    实验3:关羽

     1
     2
  • whaleFall_
    2019-10-26
    MySQL中InnoDB是支持事务的,MyISAM不支持事务的,可以通过SHOW ENGINES命令查看~
    事务,简单来说就是:要么成功,要么失败。具体:四个特性(ACID)
    A:原子性,不可分割;
    C:一致性,无论事务是否提交成功,数据库的完整性约束不会改变,即会由原来的一致性状态变为另一种一致性状态;
    I:隔离性,各个事务是独立的,不会互相影响;
    D:持久性,一旦事务提交,对数据的修改是持久的,即使系统故障,修改依然有效。

    ----分割线---
    记一下,加深印象~
    展开

    作者回复: 加油 总结的不错

    
     1
  • 知行合一
    2019-10-23
    为什么在navicat中,我和老师的代码一致。但是,实验结果,总是不同。 张飞,每次都被存进去了。很不理解!能说说吗? 谢谢
     2
     1
  • Tyrant
    2019-09-10
    我发现在navicat里,rollback完全没用,不知道为啥
    
     1
  • 森鱼
    2019-09-08
    你好,在总结部分之前,音频中有一段“DELIMITER”操作方式,我看文本中并没有相应的段落,可否有空让工作人员补上?谢谢!
    
     1
  • 张小倔
    2019-09-04
    文章中提到的保存点 savepoint,实用场景有哪些呢

    作者回复: 对于复杂的事务来说,可以采用savepoint,可以回滚到指定的保留点,操作起来更灵活

    
     1
  • 挠头侠
    2019-08-12
    老师,在第一个例子中,在第二个begin中插入了两个 ‘张飞’ ,但是执行时发生错误,不是说错误会回滚吗?为什么我们还需要指定 ROLLBACK?

    如果将第一个例子中的ROLLBACK 改成COMMIT 为什么会有一条 ‘张飞’ 插入成功呢?这两个insert不应该是一个事务内吗?不应该都进行回滚吗?
    
     1
  • linus
    2019-07-15
    DROP TABLE test;
    CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB;
    set autocommit=0;
    BEGIN;
    INSERT INTO test SELECT 'aaa';
    COMMIT;
    BEGIN;
    INSERT INTO test SELECT 'bbb';
    INSERT INTO test SELECT 'bbb';
    ROLLBACK;
    SELECT * FROM test;

    为什么我的结果还是
     aaa
     bbb
    展开
     2
     1
  • 柔软的胖
    2019-07-13
    如果“INSERT INTO test SELECT '关羽';”之后没有执行COMMIT,结果应该是空。
    但是我执行出来的结果是'关羽',为什么ROLLBACK没有全部回退。

    代码如下
    CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB;
    BEGIN;
    INSERT INTO test SELECT '关羽';
    BEGIN;
    INSERT INTO test SELECT '张飞';
    INSERT INTO test SELECT '张飞';
    ROLLBACK;
    SELECT * FROM test;
    展开

    作者回复: 在MySQL中BEGIN用于开启事务,对于连续BEGIN的情况,开启了第一个事务,还没有进行COMMIT提交,而直接进行第二个事务的BEGIN,这时数据库会隐式的帮助COMMIT第一个事务,然后进入到第二个事务

    
     1
  • Better me
    2019-07-13
    老师您好,数据库事务的隐式提交和显式提交分别有什么使用场景,能否具体举例说明下。
     1
     1
  • Demon.Lee
    2019-07-12
    ACID 可以说是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。
    ------以后面试就说这一句,如果问ACID

    作者回复: 可以的 随着我们对事务理解的深入,对ACID这四个特性也会了解的越来越全面

    
     1
  • 我不是矿长
    2019-07-12
    学习了

    作者回复: 谢谢 自己可以跑下代码 多加深理解

    
     1
  • 阿恺
    2019-07-12
    在我的实验中,事务出现错误是不会自动回滚,必须显式有 ROLLBACK 命令。如果使用sql client工具,那很可能是工具进行了判断,并做了自动处理。如果在mysql client的命令行中,不会遇错自动回滚。
    
     1
  • 慕城暖阳
    2019-12-29
    CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB;
    BEGIN;
    INSERT INTO test SELECT '关羽';
    COMMIT;
    BEGIN;
    INSERT INTO test SELECT '张飞';
    INSERT INTO test SELECT '张飞';
    ROLLBACK;
    SELECT * FROM test;

    老师,这段中第一个张飞为什么没有隐式提交呢
    展开
     1
    
我们在线,来聊聊吧