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必知必会
登录|注册

30丨锁:悲观锁和乐观锁是什么?

陈旸 2019-08-19
索引和锁是数据库中的两个核心知识点,不论在工作中,还是在面试中,我们都会经常跟它们打交道。之前我们已经从不同维度对索引进行了了解,比如 B+ 树、Hash 索引、页结构、缓冲池和索引原则等,了解它们的工作原理可以加深我们对索引的理解。同时在基础篇的部分中,我也讲解了事务的 4 大原则以及不同的隔离级别。这些隔离级别的实现都是通过锁来完成的,你可以思考下为什么我们需要给数据加锁呢?
实际上加锁是为了保证数据的一致性,这个思想在程序开发领域中同样很重要。在程序开发中也会存在多线程同步的问题。当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在进行访问,保证数据的完整性和一致性。
今天的内容主要包括以下几个方面:
就分类而言,锁的划分有多种方式,这些划分方式都包括哪些?
为什么共享锁会发生死锁?
乐观锁和悲观锁的思想是什么?乐观锁有两种实现方式,这两种实现方式是什么?
多个事务并发,发生死锁时该如何解决?怎样降低死锁发生的概率?

按照锁粒度进行划分

锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁、页锁和表锁。
顾名思义,行锁就是按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,但是对于锁的开销比较大,加锁会比较慢,容易出现死锁情况。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • 老毕
    意向锁是一种协作机制,用于表锁和行锁的共生场景。

    意向锁表达的信息很明确:某事务打算获得某种行锁,或某事务已持有某种行锁。

    这样一来,打算锁表的事务就能迅速获得足够的锁信息并决定下一步行动。

    反之,如果没有意向锁机制,打算锁表的事务就必须遍历所有行的锁信息,才能获得足够的锁信息,这样实际上就形成了行锁对表锁的严重干扰。

    如果表锁和行锁不共生,如MyISAM仅支持表锁,就不需要意向锁了。
    2019-08-19
    18
  • wonderq_gk
    死锁那个演示有问题啊,死锁是互相等待,而你演示的只是单方等待,很正常啊,根本就不是死锁
    2019-08-29
    1
    10
  • 小年
    啊,读锁不是不能修改吗,为啥模拟的客户端2说理论上可以修改呀?
    2019-09-08
    1
    4
  • melon
    老师 意向锁(intent lock)和间隙锁(gap lock) 还有next-key lock 能否说一下呢

    作者回复: 感谢提问,在InnoDB中有三种行锁的方式:
    1)记录锁:针对单个行记录添加锁。
    2)间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
    3)Next-Key锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁+记录锁,可以解决幻读的问题

    2019-08-24
    3
  • 许童童
    使用 MySQL InnoDB 存储引擎时,为什么对某行数据添加排它锁之前,会在数据表上添加意向排他锁呢?
    这样就不需要逐行扫描,看每一行上是否有排它锁了,通过大粒度,来节省资源。
    2019-08-19
    3
  • 峻铭
    乐观锁让我想起了java里面的cas原理

    作者回复: 对 乐观锁的一种实现

    2019-09-23
    1
    2
  • wonderq_gk
    主要是共享锁会发生死锁,排他锁应该不会
    2019-08-29
    1
  • yhui
    陈老师,我们同姓,麻烦帮忙看看这个问题:
    SELECT id FROM user
    WHERE 1=1 AND aid IN (1,2)
    AND bid IN (4)
    AND cid IN (-1,0,1,2,3,4,5,6,7,17,16,15,14,13,12,18,8)
    ORDER BY id DESC LIMIT 20
    我创建了(aid,bid,cid,did)的联合索引
    使用explain分析发现这条语句没用上联合索引,反而用的主键索引,然后我试着修改了下语句
    AND cid IN (-1,0,1,2,3,4,5,6,7,17,16,15,14,13,12,18,8) 把这句改成
    AND cid IN (-1,0,1,2) 改短了一些,发现索引选择对了!

    这是为什么啊,in里有个数限制多少个会触发优化器重新选择索引导致选错吗??

    2019-08-23
    2
    1
  • 老师还有个问题问下,表级锁在一个库中只能对一个表添加吗?
    我先对第一个表player添加了表级锁,这时使用UODATE 返回Table 'player' was locked with a READ lock and can't be updated,这时正常的
    我再对player_score添加表级锁 ,这次再对表player UPDATE返回 Table 'player' was not locked with LOCK TABLES,这时player也不能进行SELECT查询,同样返回Table 'player' was not locked with LOCK TABLES
    2019-11-19
  • 老师有个问题,这个锁是一般在我进行select等语句是或自动加锁吗?而在这里只是讲了有这几种锁的机制。还是说正常情况下数据库不会主动加锁,我需要主动去加锁。
    2019-11-19
  • ABC
    回来补课,8月学了一段时间,然后去忙其他的了,希望年内能学完这门课😀😀

    作者回复: 加油ABC同学,可以先粗略浏览一遍,然后找文章中感兴趣的内容,有代码的地方 自己复现一遍

    2019-11-19
    1
  • Coool
    读锁的模拟实验里,为什么可以修改上了锁的数据?
    2019-10-25
  • Beson
    老师你好,可以再详细解释一下,为什么共享锁会发生死锁吗?举的例子不太明白
    2019-10-10
  • edc
    【在进行SELECT的时候,会将对象进行共享锁锁定】这句有点模糊,如果select自动就加上了共享锁,为什么还要在SQL中加上 lock in share mode
    2019-10-07
  • Douglas
    老师,乐观锁应该还是会加锁的对不,基于行锁来修改?
    2019-09-01
    1
  • 空知
    老师问下 共享锁死锁那里,为啥开了 LOCK IN SHARE MODE 共享锁之后 理论上还可以执行UPDATE 更新操作?更新不是写操作吗?
    2019-08-31
  • 未来的胡先森
    避免死锁实际上就是破坏「死锁」产生的四个必要条件

    乐观锁解决的就是「资源互斥」问题,让资源由「锁」到相对共享
    2019-08-26
  • 马哲富
    如果没有显示的添加锁,是不是有一个默认锁?
    2019-08-22
  • 捞鱼的搬砖奇
    请问xmind可以提供下吗

    作者回复: 可以的,地址:https://github.com/cystanford/SQL-XMind

    2019-08-19
  • lmtoo
    添加意向排它锁是为了防止在锁升级时需要全表扫描;两个读锁,其中一个读锁升级为写锁,这不算是死锁吧
    2019-08-19
收起评论
22
返回
顶部