MySQL — InnoDB 锁

这篇具有很好参考价值的文章主要介绍了MySQL — InnoDB 锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在InnoDB中,使用了多种类型的锁:

  • 共享锁和排他锁(Shared and Exclusive Locks)
  • 意向锁(Intention Locks)
  • 记录锁(Record Locks)
  • 间隙锁(Gap Locks)
  • 临键锁(Next-Key Locks)
  • 插入意向锁(Insert Intention Locks)
  • AUTO-INC Locks

共享锁和排他锁

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

意向锁

意向共享锁(IS):事务想要获得一张表中某几行的共享锁。事务在给一个数据行加共享锁前必须先取得该表的 IS 锁。
意向排他锁(IX):事务想要获得一张表中某几行的排他锁。事务在给一个数据行加排他锁前必须先取得该表的 IX 锁。

由于InnoDB存储引擎支持的是行级别的锁,因此意向锁其实不会阻塞除全表扫以外的任何请求。

故表级意向锁与行级锁的兼容性如下所示:

X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容 冲突 兼容
S 冲突 冲突 兼容 兼容
IS 冲突 兼容 兼容 兼容

记录锁

记录锁是索引记录上的锁。例如:SELECT c1 FROM t WHERE c1 = 10 For UPDATE;防止任何其他事务插入、更新或删除t.c1值为10的行。

记录锁总是锁定索引记录,即使表没有定义索引。对于这种情况,InnoDB创建一个隐藏的集群索引,并使用该索引进行记录锁定。

加了记录锁之后可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题。

间隙锁

间隙锁是在索引记录之间的间隙上的锁,或者在第一个索引记录之前或最后一个索引记录之后的间隙上的锁。例如:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 For UPDATE;防止其他事务将值15插入到列t.c1中,无论列中是否已经存在这样的值,因为范围中所有现有值之间的间隙被锁定。

间隙可以跨越单个索引值、多个索引值,甚至是空的。

临键锁

next-key锁是索引记录上的记录锁和索引记录之前的间隙上的间隙锁的组合。

InnoDB执行行级锁的方式是,当它搜索或扫描一个表索引时,它会在遇到的索引记录上设置共享锁或排他锁。因此,行级锁实际上是索引记录锁。索引记录上的next-key锁也会影响该索引记录之前的“间隙”。也就是说,next-key锁是索引记录锁加上索引记录前面的间隙锁。如果一个会话对索引中的记录R具有共享锁或排他锁,则另一个会话不能在索引顺序R之前的空白中插入新的索引记录。

插入意向锁

插入意向锁是insert操作在行插入之前设置的一种间隙锁。

这个锁以这样一种方式表示插入的意图:即插入到相同索引间隙中的多个事务如果不在间隙内的相同位置插入,则不需要彼此等待。

假设存在值为4和7的索引记录。分别尝试插入值为5和6的事务,在获得插入行上的排他锁之前,每个事务都用插入意图锁锁住4和7之间的间隙,但不会相互阻塞,因为行不冲突。

自增锁

自增锁是一种特殊的表级别锁,专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。文章来源地址https://www.toymoban.com/news/detail-632915.html

到了这里,关于MySQL — InnoDB 锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JDBC】Java连接MySQL数据库

    数据库编程指的是通过编程语言与数据库进行交互和操作的过程,包括使用编程语言创建、连接、查询、更新和删除数据库中的数据,以及管理数据库结构和其他相关工作等。 另外,不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包

    2024年02月15日
    浏览(115)
  • 【java】Java连接mysql数据库及mysql驱动jar包下载和使用

    基本概念:java 数据库连接,简称:( java DataBase Connectivity ),java语言操作数据库。 其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码时驱

    2024年02月02日
    浏览(45)
  • Java基础 - JDBC操作数据库(MySql)

    JDBC是Java语言操作数据库的一套接口,也就是规范,具体的实现需要各个数据库厂商去实现。比如我们在使用JDBC去连接mySql数据库的时候,我们必须要依赖一个叫做mysql-connector-java的jar包,这里面封装的就是mySql对于JDBC的实现。 Java中使用JDBC 首先引入mysql-connector-java依赖,比如

    2024年01月25日
    浏览(59)
  • idea实现Java连接MySQL数据库

    首先如果没有mysql的需要先下载MySQL,可以看这个教程: Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客 官网:MySQL :: Download Connector/J 解压并将驱动jar包导入idea , 在Java项目中创建一个bin文件夹,然后把jar包Ctrl+C,V到bin文件夹   然后lib右键,点击Add as L

    2024年02月03日
    浏览(51)
  • 【JAVA】MySQL数据库信息管理系统

    目录 前言 一、环境搭建 二、功能实现 1.商品信息类的创建 2.商品信息的查询 3.商品信息的添加 4.商品信息的修改 5.商品信息的删除 三、主类的调用 1.加载配置文件并获取数据库连接 2.界面的搭建 3.功能的选择 总结 JAVA实现的MySQL数据库信息管理系统 包含数据库的增删改查功

    2024年02月09日
    浏览(74)
  • [Java Web]JDBC->Java操作MySQL数据库

    目录 1、简介 1.1、背景 1.2、概念 1.3、驱动程序 2、JDBC的优点 3、使用步骤 3.1、操作流程 3.2、代码步骤 3.3、实例演示 3.3.1、创建空工程 3.3.2、指定项目的名称以及存放路径 3.3.3、设置项目的JDK版本和编译版本 3.3.4、创建模块 3.3.5、⭐导入MySQL驱动包 3.3.6、⭐创建Java类 4、API详

    2024年02月03日
    浏览(65)
  • Java连接mysql数据库的详细教程(增查)

    jdk安装: eclipse安装使用: mysql安装教程:详细参考 Navicat安装教程:参考 忽略。 鼠标右键点击Fir工程 —— New ——Folder、 文件夹命名为lib 把mysql-connector-java-5.1.13-bin.jar文件,复制到jdbc工程下的lib文件夹里。 ps:如果下载不了jar文件,可以私信我,或直接百度也行 鼠标右键

    2024年02月07日
    浏览(47)
  • Java的JDBC编程—连接Mysql数据库

    目录 一、 Java的数据库编程:JDBC 二、JDBC工作原理 三、 JDBC使用 四、JDBC使用步骤总结  五. JDBC常用接口和类 5.1 JDBC API 5.2 数据库连接Connection 5.3 Statement对象 5.4 ResultSet对象      JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据

    2024年02月05日
    浏览(71)
  • java 银行管理系统(连接数据库Mysql)

    程序共有三个文件 Bankmangement.java:包括程序运行的主函数,方法等 User.java:实体类,用于创建对象 JDBCUtils:对数据库方法进行封装 1.User实体类 数据库共有三张表,分别是admin管理员帐号,user用户账号,record用户记录。 2.Bankmangement功能图 Bankmangement User JDBCUtils

    2024年02月12日
    浏览(39)
  • 关于JAVA Maven项目连接mysql数据库

      本文作为个人学习笔记 此处使用8.0.28版本,关于mysql更多依赖版本查阅:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j 1、指定驱动器 本部分指定jdbc驱动器类名,使用Class.forName()以加载数据库驱动程序 2、指定数据库 本部分指定所需数据库的url链接,(注:在测试过程中

    2024年04月12日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包