• 【mysql索引实现原理】


    总结

    共享锁大家可能很好理解,就是多个事务只能读数据不能改数据;

    排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的,

    • 排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。

    • mysql InnoDB引擎默认的修改语句insert,update,delete都会自动给涉及到的数据加上排他锁,

    • select语句默认不会加任何锁类型,所以排它锁可以通过select查询数据。

    1.行锁和表锁

    在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,

    行锁则无法实现,取而代之的是表锁。

    表锁:不会出现死锁,发生锁冲突几率高,并发低。

    行锁:会出现死锁,发生锁冲突几率低,并发高。

    锁冲突:例如说事务A将某几行上锁后,事务B又对其上锁,锁不能共存否则会出现锁冲突。(但是共享锁可以共存,共享锁和排它锁不能共存,排它锁和排他锁也不可以)

    死锁:例如说两个事务,事务A锁住了1-5行,同时事务B锁住了6-10行,此时事务A请求锁住6-10行,就会阻塞直到事务B施放6-10行的锁,而随后事务B又请求锁住1-5行,事务B也阻塞直到事务A释放1-5行的锁。死锁发生时,会产生Deadlock错误。

    锁是对表操作的,所以自然锁住全表的表锁就不会出现死锁。

    2.行锁的类型

    行锁分 共享锁 和 排它锁。
    共享锁又称:读锁(多个线程都可以读)。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。

    排它锁又称:写锁(多个线程都可以读)。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。包括写锁。

  • 相关阅读:
    #Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐
    电源插座是如何传输电的?困扰小伙伴这么多年的简单问题
    刷题日记【第三天】
    ES6高级-Promise的用法
    Flutter笔记:缩放手势
    leetcode题型分析《链表》
    【JAVA】LinkedList与链表(Part1)
    【qml】QML最佳实践01
    uni-app发布后iOS端页面背景图片上下滑动问题
    笔记_HTML+CSS精选
  • 原文地址:https://blog.csdn.net/qq_36881887/article/details/126231983