返回顶部
首页 > 资讯 > 数据库 >浅析MySQL 锁和事务
  • 239
分享到

浅析MySQL 锁和事务

MySQLMySQL事务 2022-05-13 14:05:23 239人浏览 安东尼
摘要

Mysql本身也是在文件系统的基础上发展而来,因为锁的存在使之有所不同。 mysql作为一种数据库软件,难免会存在对其共享资源的并发访问,为了协调和管理不同资源的并发访问,也就产生了锁机制,因为锁机制的存在为数据库

Mysql本身也是在文件系统的基础上发展而来,因为的存在使之有所不同。

mysql作为一种数据库软件,难免会存在对其共享资源的并发访问,为了协调和管理不同资源的并发访问,也就产生了锁机制,因为锁机制的存在为数据库提供了数据的完整性和一致性。

从锁的级别来分锁可分为:行级锁、表级锁、页级锁。
从锁的类型来分锁可分为:共享锁、排它锁(独占锁)。
为了协调行锁、表锁产生了:意向锁(表级锁)。

共享锁,允许事务去读取数据。
排它锁,允许事务去修改或删除数据。
意向锁,获取行级锁的时候,自动添加的表级锁,包含:意向共享锁、意向排它锁。

对于MyISAM存储引擎,只支持表锁,而InnoDB存储引擎则支持行锁、表锁。

MyISAM存储引擎修改、删除数据的时候,会产生排它锁,锁定的整张表,并发写入性能较差,而读取的时候产生的是共享锁,不会锁定表,读取性能就比较好。

InnoDB存储引擎修改、删除数据的时候,会产生排它锁,锁定的特定索引记录,一般不会影响表中的其它行,并发写入性能较好,而读取的时候产生的是共享锁,不会锁定表和行,读取性能较好。

行锁锁定的是索引记录,而不是记录行,如果没有索引,则使用隐式索引进行锁定。

当一张表某些行已经获取了排它锁,在表中会产生一个意向排它锁,如果此时有一个事务要来锁定整张表,那么一看有意向排它锁的存在,该事务就会被阻塞,通过意向锁直接就可以知道能不能锁定表,不需要逐行去遍历检测是否有排它锁,通过意向锁高效地协调了行锁和表锁的关系。

行级锁按照锁定范围来分,又分为三种:

  • Record Lock 单行记录上的锁。
  • Gap Lock 间隙锁,锁定一个范围,不包含记录本身。
  • Next-Key Lock 锁定一个范围,包含记录本身,用于解决幻读问题。

当然,锁也是有利有弊的,也可能出现死锁的情况。
当两个或两个以上的事务在执行过程中,因争夺资源而造成一种相互等待的现象,称为死锁。

最后,也是因为锁的存在,丰富了后续事务的功能。

MySQL通过设计一种机制,使得数据能够完整地从一种一致性状态切换到另一种一致性状态,这种机制称为事务。

事务包含有四大特性:原子性(A)、一致性(C)、隔离性(I)、持久性(D),简称酸性。

  • 原子性:事务中的操作,要么全部成功,要么全部失败,不可切分。
  • 一致性:事务将数据库从一种一致性状态转变成另外一种一致性状态,并且保证数据的完整性。
  • 隔离性:又称并发控制,事务在提交之前对于其它事务是处于不可见的状态的。
  • 持久性:事务一旦提交,结果就是永久性的,不会因为数据库宕机而丢失数据。

原子性、持久性是通过redo日志实现的,一致性是通过undo日志实现的,隔离性是通过锁机制实现的。

从本质上来说,原子性也是为了配合持久性而存在的,当事务的一部分写入redo日志后,发生了崩溃、断电,那么根据原子性来说,该次事务应当恢复,那么对于已经持久化到日志文件中的数据,就必须要通过回溯来撤销。在InnoDB存储引擎中,redo重做日志对应的就是ib_logfile0、ib_logfile1。

接着,事务要进行回滚,那就需要通过一致性来保障,而undo日志就是用来实现一致性的,在undo日志中保存了多个版本的事务的一些信息,通过undo日志,将事务rollback到修改之前的样子。

在此,不得不提的是MysqlmvcC多版本并发控制,它也是通过undo日志来实现的。
MVCC是通过在每一数据行后头添加2个隐藏字段create version、delete version以及每次开启一个事务会初始化一个事务id。新增一条数据的时候,create version的值就等于事务id,删除数据的时候,delete version就等于事务id,更新数据的时候会先删后增,在undo日志中就会存在2条数据,一条delete version就等于事务id,一条create version的值等于事务id。

在事务执行过程中,可能会同时存在其它的事务,而多个事务之前需要相互隔离,也就是要做到并发控制,锁就是用来实现隔离性的。MySQL的事务的隔离级别包含:Read Uncommitted读未提交、Read Committed读已提交、Read Repeatable可重复读、Serializable串行化。其中,读已提交、可重复读是基于MVCC多版本并发控制来实现的。

锁,为事务的并发控制带来了好处,同时也带来了坏处,包括:脏读、不可重复读、幻读。

脏读,指的是一个事务读到了另一个事务未提交的内容,一旦另一个事务回滚了,就出现了脏数据。
不可重复读,指的是同一个事务使用同一句SQL进行多次读取,返回不同的结果。
幻读,指的是一个事务在进行增删的时候,某些已经确定不会出现的记录突然出现。

要解决脏读,那就需要至少设置隔离级别为:Read Committed读已提交。
要解决不可重复读,那就需要至少设置隔离级别为:Read Repeatable可重复读。
要解决幻读,那就需要设置隔离级别为:Serializable串行化或者采用Next-Key Lock间隙锁。

以上就是浅析MySQL 锁和事务的详细内容,更多关于MySQL 锁和事务的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 浅析MySQL 锁和事务

本文链接: https://lsjlt.com/news/9866.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析MySQL 锁和事务
    MySQL本身也是在文件系统的基础上发展而来,因为锁的存在使之有所不同。 MySQL作为一种数据库软件,难免会存在对其共享资源的并发访问,为了协调和管理不同资源的并发访问,也就产生了锁机制,因为锁机制的存在为数据库...
    99+
    2022-05-13
    MySQL MySQL 事务
  • MySQL行锁浅析
    概述 MySQL是非常流行的关系型数据库,许多系统都使用它来存储和管理数据。在高并发环境下,为了保证数据的一致性和可靠性,数据库需要实现并发控制,其中包括锁机制。MySQL提供了两种锁类型,一种是表级锁,另一种是行级锁。本文将深入探讨My...
    99+
    2023-08-19
    mysql 数据库 java
  • MySQL 事务和锁
    事务概述 当多个用户访问同一份数据时,一个用户在更改数据的过程中,可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另外一个一致性状态,使用事务处理是非常必要的,事务具有以下四个特性: 原子性(Atomicit...
    99+
    2020-12-06
    MySQL 事务和锁
  • mysql中的锁浅析
    前言 MySQL 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为...
    99+
    2023-09-15
    mysql 数据库 锁机制
  • MySQL中事务和锁的示例分析
    小编给大家分享一下MySQL中事务和锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! My...
    99+
    2024-04-02
  • MySQL中表锁和行锁机制浅析(源码篇)
    目录前言行锁mysql 事务属性事务常见问题事务的隔离级别间隙锁排他锁共享锁分析行锁定行锁优化表锁共享读锁独占写锁查看加锁情况分析表锁定什么场景下用表锁页锁补充:行级锁与死锁总结前言 众所周知,MySQL的存储引擎有My...
    99+
    2024-04-02
  • MySQL数据库入门——浅析 视图和事务
    ==========视图============数据库中的虚拟表,相当于软链接作用:一张表中的数据给不同的权限用户提供访问假设一张表:公司员工绩效工资考核表工号    ...
    99+
    2024-04-02
  • MySQL InnoDB 事务锁源码分析
    目录1. Lock 与 Latch2. Repeatable Read3. Insert加锁流程3.1 lock mode3.2 加锁流程3.3 隐式锁4. Select 加锁流程本...
    99+
    2024-04-02
  • mysql事务和隔离级别底层原理浅析
    目录前言一、事务底层原理浅析原子性:持久性隔离性:一致性:二、隔离级别底层原理浅析三、总结前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一...
    99+
    2024-04-02
  • 事务和锁-
    数据库加锁是修改哪一条加锁,还是在页上加锁,还是在表上加锁,数据库来决定 如果你更改的是两条记录,就在两条记录上加锁,如果你更改的是很多条,这个时候数据库一看一条一条加锁太麻烦,给整个页加锁更省事,或者给整个表加锁更加省事 加锁的级别越大,...
    99+
    2021-01-25
    事务和锁-
  • 浅析MySQL如何实现事务隔离
    目录一、前言二、RC与RR隔离级别2.1、RR事务隔离级别下查询结果2.2、RC事务隔离级别下查询结果三、事务隔离在MVCC的实现3.1、数据行ROW的多版本3.2、视图数组3.3、一致性视图3.4、当前读与快照读3...
    99+
    2022-05-16
    MySQL 事务隔离
  • MySQL事务和锁——《MySQL DBA工作笔记》
    MySQL事务 事务存在的原因 事务存在的目的:保证用户对数据操作对数据是安全的。(比如说银行卡余额) 事务的特性——ACID 原子性:一个事务要么全部执行,要么不执行 一致性:事务开始和结束时,数据保持一致 隔离性:事务之间互不影响 持久...
    99+
    2020-04-05
    MySQL事务和锁——《MySQL DBA工作笔记》
  • 如何浅析mysql事务和隔离级别底层原理
    本篇文章给大家分享的是有关如何浅析mysql事务和隔离级别底层原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作...
    99+
    2023-06-21
  • MySQL学习笔记(13):锁和事务
    本文更新于2019-09-22,使用MySQL 5.7,操作系统为Deepin 15.4。 目录锁锁概述MyISAM表级锁InnoDB行级锁InnoDB表级锁死锁事务事务概述InnoDB事务分布式事务 锁 锁概述 MyISAM和M...
    99+
    2015-05-30
    MySQL学习笔记(13):锁和事务
  • MySQL事务和锁的应用技巧
    用表锁定代替事务在MySQL 的MyISAM类型数据表中,并不支持COMMIT(提交)和ROLLBACK(回滚)命令。当用户对数据库执行插入、删除、更新等操作时,这些变化的数据都被立刻保存在磁盘中。这样,在...
    99+
    2024-04-02
  • MySQL事务和InnoDB锁类型介绍
    这篇文章为大家带来有关MySQL事务和InnoDB锁类型的介绍。文章涵盖MySQL事务和InnoDB锁类型的知识点,希望大家通过这篇文章能有所收获。一、事务的隔离级别1、4 种隔离级别(1)未提交读(Rea...
    99+
    2024-04-02
  • MySQL事务与锁 - Mr
    一、事务与事务特性 在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来的操作,即一条SQL也不能执行成功。 ...
    99+
    2016-11-14
    MySQL事务与锁 - Mr
  • InnoDB 事务加锁分析
    本文首发于 vivo互联网技术 微信公众号  链接:https://mp.weixin.qq.com/s/S7MhlsZveBHRSQhq5aTIJA 作者:何志创 一般大家对数据库事务的了解可能停...
    99+
    2024-04-02
  • MySQL数据库高级(七)——事务和锁
    MySQL数据库高级(七)——事务和锁 一、事务简介 1、事务简介 事务(Transaction) 是指作为单个逻辑工作单元执行的一系列操作。 2、事务的特性 A、原子性(Atomicity)表示组成一个事...
    99+
    2024-04-02
  • MYSQL INNODB replace into 死锁 及 next key lock 浅析
    原创:全文带入了大量自我认知和理解,可能错误,因为水平有限,但是代表我努力分析过。 一、问题提出 问题是由姜大师提出的、问题如下: 表: mysql> show create table c \...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作