zoukankan      html  css  js  c++  java
  • Mysql锁

    锁大家应该都知道,不多BB,直接开讲

    为什么需要锁:

     到淘宝上买东西,库存只剩一件的时候,两个人同时买,到底如何解决谁买到的的问题?

    1:我们先从库存表中取出物品数量

    2:插入订单

    3:付款后插入付款表

    4:然后更新商品数量

    在这个过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾;

    锁的概念:

    锁是计算机协调多个进程或线程并发访问某一资源的机制

    在数据库中数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素;

    锁对数据库而言显得尤其重要,也更加复杂

    Mysql中的锁

    Mysql的锁机制比较简单

    其最显著的特点是不同的存储引擎支持不同的锁机制

    比如:

      MyISAM和Memory存储引擎采用的是表级锁(table-level locking)

      InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但是默认情况下采用的是行级锁

    表级锁:开销小,加锁快;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低.

    行级锁:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高.

    页面锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度也介于表锁和行锁之间,并发度一般.

    仅从锁的角度来说:

      表级锁更适合于以查询为主,只有 少量按索引条件更新数据的应用,如OLAP系统

      行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事物处理(OLTP)系统

      很难笼统的说那种锁更好,只能就具体应用的特点来说那种锁更合适.

    MyISAM的表锁

    Mysq的表级锁有两种模式

    表共享读锁(table read lock)

    表独占写锁(table write lock)

    请求锁模式

      是否兼容

    当前锁模式

    NONE 读锁 写锁
    读锁
    写锁

    自己的理解:读的时候可以读,读的时候不能写,写的时候不能读,写的时候不能写;

    读锁是共享锁;写锁是独占锁;

    绕口令[捂脸]

    MyISAM的共享读锁

    给表添加读锁

    lock table [tableName] read;

    解锁

    unlock tables;

    当表添加读锁后在同一个Session会话中执行Insert or update会报错,而其他的Session会进入等待状态,一直到那个Session释放锁

    当表添加读锁后在同一个Session会话中对其他表执行insert or Update会报错,查询其他表也会报错,在另外的Session对其他表进行操作不会报错,成功;

    有兴趣,大家自己试一试,我觉得没啥用,了解一下就可以,就没有Demo了

    还有一个坑就是,加锁的时候锁的表名是可以做别名的,如果没有做别名,那么只能查锁的那个表名,查询时不能采用别名,如果想用,请在锁的时候加上;

    lock table test read;

    select * from test;//不会报错

    select a.* from test as a;//会报错

    lock table test as a read //做别名

    MyISAM的独占写锁

    给表添加写锁

    lock table [tableName] write;

    解锁

    unlock tables;

    当表添加写锁后,在自身会话中可以insert or update or delete,其他表中查询会进入等待

    当表添加写锁后,在自身会话中无法对其他表进行insert or update or delete

    别名的坑是同样的,就不写例子了

    MyISAM的表锁

    总结:

    对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求

    对MyISAM表的读操作,不会阻塞当前Session对表的读操作,当对表修改会报错

    一个Session使用 LOCK TABLE命令给表F添加读锁,这个Session可以查询锁定表中的记录,但更新或访问其他表都会提示报错;

    另一个Session可以查询表中的记录,但更新会出现锁等待

    对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作

    对MyISAM表的写操作,当前Session可以对本表做CRUD,但对其他表操作会报错

    InnoDB的行锁

    在Mysql中的InnoDB存储引擎支持行锁

    行锁:

      共享锁又称:读锁,当某一个事物对某几行上锁时,允许其他事物对这几行进行读操作,但不允许进行写操作,也不允许其他事物给这几行上排它锁,但允许上读锁;

      排它锁又称:写锁:当一个事物对某几行上读锁时,不允许其他事物写,但允许读,更不允许其他事物给这几行上任何锁,包括读锁;

    添加行读锁

    select * from [tableName] where 条件 lock in share mode;

    添加行写锁

    select * from [tableName] where 条件 for update;

    行锁添加之前需要开启事物

    开启事物

    Begin

    当执行commit 或者rollback的时候会释放行锁

    InnoDB添加表锁和MyISAM一致

    但是有一点是,当开启事物的时候表锁会被释放

    物理结构修改:

    面试题:系统运行一段时间,数据量已经很大,这时候系统升级有张表A需要增加字段,并发量白天晚上都很大,请问则么修改表结构?

    面试考点:修改表结构会导致表锁,数据量大,修改数据很长,导致大量用户无法访问!

     看着比较复杂

    物理结构修改工具 pt-online-schema-change

     

    作者:彼岸舞

    时间:202077

    内容关于:Mysql

    本文来源于网络,只做技术分享,一概不负任何责任

  • 相关阅读:
    spring入门
    Page.Load和Page_Load差异
    先写alert('提示语句!') 后写Redirect语句,为什么只是跳转而不显示提示语句框
    session.close() session.clear() session.abandon()区别
    关于用户退出,点击浏览器后退仍可回到原来页面
    SQL将一个表中查询语句插入另一张表中的某一列
    复习
    读取xml文件或者项目文件***.csproj 时,出现给定编码中的字符无效。
    电子公文传输系统 团队作业(五):冲刺总结(第四天)
    缓冲区溢出漏洞实验
  • 原文地址:https://www.cnblogs.com/flower-dance/p/13258558.html
Copyright © 2011-2022 走看看