• 浅谈一下MySql中的锁



    活动地址:CSDN21天学习挑战赛

    一.共享锁和排他锁

    读读共享,读写互斥,写写互斥
    共享锁又称之为读锁,简称s锁,鸡多个事务对于同一数据可以共享一把锁,都能访问到数据,但是不能修改。
    排他锁又称为写锁,简称x锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享发锁和排他锁,但是获取排他锁的事务可以对数据就行读取和修改。
    常⻅的⼏种 SQL 语句的加锁情况如下:

    select * from table; #不加锁
    update/insert/delete #排他锁
    select * from table where id = 1 for update; #id为索引,加排他锁
    select * from table where id = 1 lock in share mode; #id为索引,加共享锁
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    数据库的⾏锁和表锁

    ⾏锁:操作时只锁某⼀(些)⾏,不对其它⾏有影响。开销⼤,加锁慢;会出现死锁;锁定粒度⼩,发⽣锁冲突的概率低,并发度⾼。

    表锁:即使操作⼀条记录也会锁住整个表。开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突概率⾼,并发度最低。

    ⻚锁:操作时锁住⼀⻚数据(16kb)。开销和加锁速度介于表锁和⾏锁之间;会出现死锁;锁定粒度介于表锁和⾏锁之间,并发度⼀般。

    ⾏锁是怎么实现的

    InnoDB ⾏锁是通过索引上的索引项来实现的。意味者:只有通过索引条件检索数据,InnoDB 才会使⽤⾏级锁,否则,InnoDB将使⽤表锁!
    对于主键索引:直接锁住锁住主键索引即可。
    对于普通索引:先锁住普通索引,接着锁住主键索引,这是因为⼀张表的索引可能存在多个,通过主键索引才能确保锁是唯⼀的,不然如果同时有2个事务对同1条数据的不同索引分别加锁,那就可能存在2个事务同时操作⼀条数据了。

    乐观锁和悲观锁

    悲观锁:当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该 数据进行加锁以防止并发问题。
    悲观锁优点:数据更加安全,不容易出现并发问题 悲观锁缺点:高并发时对性能较大,而且可能出现死锁现象。

    乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时 候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁 适用于读多写少的场景,这样可以提高程序的吞吐量。

    MySQL 如何实现悲观锁和乐观锁?

    乐观锁:更新时带上版本号(cas更新)
    悲观锁:使⽤共享锁和排它锁,select…lock in share mode,select

  • 相关阅读:
    SVM模型实现人脸识别
    Unocss(原子化css) 使用及vue3 + vite + ts讲解
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[29]总结
    c# 串口调试助手
    清华、IDEA、港中文联合发表的 DQ-DETR: Dual Query Detection Transformer for Phrase Extraction and Grounding论文阅读笔记
    汽车tbox车联网系统终端
    C#反射机制
    -钞票兑换-
    CH341 USB总线转接芯片
    金仓数据库KingbaseES客户端应用参考手册--13. sys_isready
  • 原文地址:https://blog.csdn.net/weixin_43189971/article/details/126456287