首页 > 数据库 >MySQL 锁机制

MySQL 锁机制

时间:2023-07-25 18:46:10浏览次数:38  
标签:表锁 事务 加锁 行锁 死锁 MySQL 机制 锁定

数据库锁:

概念:

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免资源争抢)

分类:

按粒度

  • 表级锁:锁定整个表
    • 开销小 加锁快 不会出现死锁 锁定粒度大 发生锁冲突的概率最高 并发度最低
      数据库引擎总是一次性同时获取所有需要的锁以及总是按相同的顺序获取表锁从而避免死锁
      表读锁 会阻塞写 不阻塞读
      表写锁 读写都阻塞
    • 元数据锁:可以理解为表结构锁 对表的结构进行加锁
      表在做增删改查动作的时候 加读锁
      表在修改结构的时候 加写锁
  • 页面锁:只有BDB引擎支持
    • 开销和加锁时间界于表锁和行锁之间
    • 会出现死锁
    • 锁定粒度界于表锁和行锁之间,并发度一般。
  • 行级锁:锁定当前操作行 只有InnoDB支持
    • 开销大 加锁慢 会出现死锁 锁定粒度最小 并发度也最高
      行锁是逐步获得的 因此会出现死锁
    • 行锁并不是锁行数据 而是锁索引(主索引、二级索引)在更新、删除的时候还会锁定相邻的键值
  • 全局锁:对整个数据库实例加锁 数据库变成只读状态
    最多是在数据备份时使用

InnoDB引擎支持表锁和行锁 默认采用行锁

按读写

  • 排它锁:又称独占锁、X锁、写锁
    X锁不能和其他锁兼容,只要有事务对数据上加了任何锁,其他事务就不能对这些数据再放置X了,同时某个事务放置了X锁之后,其他事务就不能再加其他任何锁了,只有获取排他锁的事务是可以对数据进行读取和修改
  • 共享锁:又称读锁、S锁
    S锁与S锁兼容 可以同时放置
  • 更新锁:又称U锁
    它允许再加S锁,但不允许其他事务再施加U锁或X锁,当被读取的数据要被更新时,则升级S锁为X锁。U锁的优点是允许事务A读取数据的同时不阻塞其它事务,并同时确保事务A自从上次读取数据后数据没有被更改,因此可以减少X锁和S锁的冲突,同时避免使用S锁后再升级为X锁造成的死锁现象。注意,MySQL并不支持U锁,SQLServer才支持U锁

按状态:

当行锁锁定后 会自动为当前表添加意向锁
意向锁分为:意向共享锁、意向排他锁 类型由行锁类型决定

意向锁的作用就是 在申请表锁的时候 不需要一行行判断是否有行锁
只需要判断当前表是否有意向锁就行

按算法:

下面三种所都是行锁

  • 记录锁:锁住一行记录 也分读写锁
  • 间隙锁:锁住一段范围 是为了解决可重复读级别下的幻读问题
  • 临键锁:相当于记录锁和间隙锁的结合 能锁住一定范围和一行记录

死锁:

间隙锁是相互兼容的 所以可能存在两个事务对同一段间隙都加锁的情况
然后都在等待对方释放间隙锁

解决死锁:

  • 设置事务等待锁的超时时间:事务的等待时间超时后 主动回滚事务
    InnoDB中是参数:innodb_lock_wait_timeout 默认值为50秒
  • 开启主动死锁检测:在发现死锁后 主动回滚某一个事务
    InnoDB中是参数:innodb_deadlock_detect 默认是on 表示开启

标签:表锁,事务,加锁,行锁,死锁,MySQL,机制,锁定
From: https://www.cnblogs.com/AnotherVincent/p/17580623.html

相关文章

  • MySQL 日志机制
    日志机制:错误日志:当数据库无法正常启动时第一个定位错误日志数据库速度慢时也可以定位错误日志得到建议(如增大缓存池增大redologbuffer等)查询日志:没啥用就是记录查询而已应该是为了对应binlog记录修改的日志慢查询日志:捕获查询慢的情况配置:可以设置每分钟最多有......
  • MySQL 数据库连接
    数据连接:连接:MySQL驱动:mysql-connector-Java-XXX.jar数据库连接的建立及关闭是及耗费系统资源的操作,在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。通过DriverManager获得数据库连接的方式,一个数据库连接对象对应一个物理数据库连接,每次操作都打开一个物......
  • MySQL 容灾备份
    容灾备份:数据备份:直接对数据库进行备份:#数据库备份语句#不指定表名的话默认就是整个数据库备份#备份文件可以指定绝对路径mysqldump-u[用户名]-p[库名][表名]...>[备份文件.sql]#多个数据库备份语句mysqldump-u[用户名]-p--databases[库名][库名]......
  • MySQL 索引
    索引分析:索引概述:定义:MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。结论:索引是数据结构结构:MySQL支持多种存储引擎而各种存储引擎对索引的支持也各不相同因此MySQL数据库支持多种索引类型如BTree索引、哈希索引、全文索引等等目前大部分数据库......
  • kettle连接数据库报错:Error connecting to database: (using class org.gjt.mm.mysql.
    kettle连接MySQL报错但已经把相应的包放到kettle的lib目录下时,仍然报连接不上的错误,那可能是MySQL时区的问题。解决如下:登入MySQL修改为东八区的命令:方法一:mysql>setglobalmax_allowed_packet=1024*1024;mysql>setglobaltime_zone='+8:00';方法二:修改my.ini文件,在[mysql......
  • Mysql开启慢查询日志
    查看mysql的慢查询日志是否开启showvariableslike'%query%';  可以看到slow_query_log的值是OFF,mysql默认是不启用慢查询日志的。这里还有个long_query_time,默认是10秒,也就是超过了10秒即为慢查询。log_queries_not_using_indexes,如果设置为ON,则会将所有没有使用索引的查......
  • mysql 中 myisam 与 innodb 的区别?
     1.事务支持>MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。>InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、回滚(rollback)和崩溃修复能力(crashrecoverycapabilities)的事务安全(transaction-safe(......
  • sql server 创建复制机制
    SQLServer创建复制机制整体流程下面是创建SQLServer复制机制的整体流程,可以用表格展示步骤:步骤描述1创建发布者2创建订阅者3配置发布者4配置订阅者5启动复制具体步骤和代码示例步骤1:创建发布者首先,我们需要创建一个发布者(即主数据库),用来......
  • springboot mysql 配置 propertis
    SpringBootMySQL配置Properties在SpringBoot应用程序中,我们经常需要使用MySQL数据库来存储和检索数据。为了连接和配置MySQL数据库,我们可以使用application.properties文件。这篇文章将向您展示如何使用SpringBoot的application.properties文件来配置MySQL数据库连接。1.引......
  • 允许任意IP访问mysql数据库
    问题描述MYSQL默认只能本地连接,即127.0.0.1和localhost,其他主机IP无法访问数据库,否则会出现如下报错信息:HostisnotallowedtoconnecttothisMySQLserver一、先在本地用localhost用户登录MYSQLmysql>mysql-hlocalhost-uroot-p1二、查询用户表mysql>selecthost,us......