SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?

陈旸 2019-07-12
我们知道在 MySQL 5.5 版本之前,默认的存储引擎是 MyISAM,在 5.5 版本之后默认存储引擎是 InnoDB。InnoDB 和 MyISAM 区别之一就是 InnoDB 支持事务,也可以说这是 InnoDB 取代 MyISAM 的重要原因。那么什么是事务呢?事务的英文是 transaction,从英文中你也能看出来它是进行一次处理的基本单元,要么完全执行,要么都不执行。
这么讲,你可能觉得有些抽象,我换一种方式讲。
不知道你是否遇到过这样的情况,你去家门口的小卖铺买东西,已经交了钱,但是老板比较忙接了个电话,忘记你是否交过钱,然后让你重新付款,这时你还要找之前的付款记录证明你已经完成了付款。
实际上如果我们线下的交易也能支持事务(满足事务的特性),就不会出现交了钱却拿不到商品的烦恼了,同样,对于小卖铺的老板来说,也不存在给出了商品但没有收到款的风险。总之,事务保证了一次处理的完整性,也保证了数据库中的数据一致性。它是一种高级的数据处理方式,如果我们在增加、删除、修改的时候某一个环节出了错,它允许我们回滚还原。正是因为这个特点,事务非常适合应用在安全性高的场景里,比如金融行业等。
我们今天就来学习下 SQL 中的事务。今天的课程你将重点掌握以下的内容:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(40)

  • 柔软的胖
    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第一个事务,然后进入到第二个事务

    2019-07-13
    15
  • 庞鑫华
    老师,什么时候能讲一下redo,undo log
    2019-07-25
    4
  • 夜路破晓
    事务是个有理想、有个性、讲爱憎的耿直BOY。跟这样的人打交道会很放心。

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

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

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

    2019-07-12
    2
    3
  • 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
    2019-07-17
    2
    2
  • 时间是最真的答案
    不知道作者在什么样的环境下操作的,我实验结果和你的不一样;
    我的 MySQL8.0,使用 Navicat 12 操作的,实验结果都不一样
    第一个实验,数据库中插入两条数据:关羽,张飞
    第二个实验,数据库中插入两条数据:关羽,张飞
    第三个实验,数据库中插入一条数据:关羽
    麻烦老师回复一下

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

    2019-07-12
    1
    2
  • Ant
    老师能不能穿插着一些工作环境中的实例来介绍呢?比如说事务的自动提交,生产当中我们要设置成自动提交还是不自动提交,是基于什么样的情况下才这样设计,这样就更容易理解了~,一个小建议
    2019-07-12
    2
  • whaleFall_
    MySQL中InnoDB是支持事务的,MyISAM不支持事务的,可以通过SHOW ENGINES命令查看~
    事务,简单来说就是:要么成功,要么失败。具体:四个特性(ACID)
    A:原子性,不可分割;
    C:一致性,无论事务是否提交成功,数据库的完整性约束不会改变,即会由原来的一致性状态变为另一种一致性状态;
    I:隔离性,各个事务是独立的,不会互相影响;
    D:持久性,一旦事务提交,对数据的修改是持久的,即使系统故障,修改依然有效。

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

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

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

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

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

    如果将第一个例子中的ROLLBACK 改成COMMIT 为什么会有一条 ‘张飞’ 插入成功呢?这两个insert不应该是一个事务内吗?不应该都进行回滚吗?
    2019-08-12
    1
  • linus
    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
    2019-07-15
    2
    1
  • 柔软的胖
    如果“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第一个事务,然后进入到第二个事务

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

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

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

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

    2019-07-12
    1
  • 阿恺
    在我的实验中,事务出现错误是不会自动回滚,必须显式有 ROLLBACK 命令。如果使用sql client工具,那很可能是工具进行了判断,并做了自动处理。如果在mysql client的命令行中,不会遇错自动回滚。
    2019-07-12
    1
  • 憨憨学技术
    如果事务中所有sql语句执行正确则需要自己手动提交commit;否则有任何一条执行错误,需要自己提交一条rollback,这时会回滚所有操作,而不是commit会给你自动判断和回滚。
    2019-11-09
    2
  • Crush
    一般不是执行失败执行回滚才有意义吗?不通过流程语句判断一下吗?
    2019-09-26
收起评论
40
返回
顶部