mysql架构

  • 为了解并发问题,引入锁,mysql中锁分为读锁和写锁,即share lock和exclusive lock。故名思义,share lock之间不互斥,share lock和exclusive lock之间互斥,exclusive lock之间互斥。mysql 提供行锁row lock和表锁 table lock的multiple granularity locking。对于表锁,mysql提供一种意图锁的机制,意图锁也是分为两种,intention share lock和intention exclusive lock。对于intention lock

    • Before a transaction can acquire a shared lock on a row in a table, it must first acquire an IS lock or stronger on the table.
    • Before a transaction can acquire an exclusive lock on a row in a table, it must first acquire an IX lock on the table.
    • Intention locks do not block anything except full table requests (for example, LOCK TABLES ... WRITE). The main purpose of intention locks is to show that someone is locking a row, or going to lock a row in the table
    • intention lock之间并不互斥,intention lock只是告诉你有人对表中的某些行在上锁。
  • mysql row lock是在存储引擎层实现的,不同的存储引擎可能有不同的实现方式

事务

  • 事务是指一批操作,要么全部成功,要么全部失败。
  • 数据库事务的ACID特性
    • atomicity原子性:即一个事务已一个原子的操作执行,是一个不可分隔的最小单元,事务中的操作,要么全部执行成功,要么全部失败。
    • consistency 一致性:数据库总是从一个一致的状态转移到另一个一致的状态
    • isolation: 隔离性:一个事务中的修改,在什么时候对另一个事务可见
    • durability: 持久性: 提交的事务不会丢失
  • 隔离级别
  • 隔离级别是对不同的事务而言的。
    • read uncommitted:一个事务中未提交的修改也对另外的事务可见,在这里隔离级别下,会出现脏读,即事务1未提交的修改可能被别的事务可见。
    • read committed: 一个事务提交commit后的修改才对另一个事务可见。但是可能会出现不可重复读的问题,即在一个事务1中,连续select两次,得到的结果不同,因为在这中间,可能记录被别的事务修改了。
    • repeatable read:一个事务中,多次select的结果总是相同的,但可能出现幻读的情况,即虽然对于同一行的结果,始终是相同的,但可能别的事务在insert别的行,导致一个事务中间看到的记录是不同的。
    • serializable:事务串行执行。
  • 怎么解决不可重复读问题?在一个事务开始时,对涉及到的row加上行锁即可以保证另一个事务无法修改这一行。但是这解不了幻读的问题,因为别的事务可能insert的是别的行。这时候,需要引入gap lock。不仅锁这一个row,还锁这个row的前后间隙。具体怎么锁,根据查询条件是走唯一索引还是非唯一索引,是走等值匹配还是范围匹配有不同的gap lock lock的范围,但一个原则就是:保证你这个语句的查询范围内的数据不会被其他事务insert进去。
  • 事务的两段锁:
    • 在事务的执行过程中,随时可以进行锁定,但只有事务执行完毕commit或者rollBack的时候,才会释放锁。

MVCC 多版本并发控制

  • 前面说锁分为读锁和写锁,这是一种悲观锁,MVCC是一种乐观锁,通过版本号控制,读副本的方式,来使得select读不用加锁,每次都读副本,同时保证读到的都是事务开始之前写入的数据。因为大多数数据库操作都是读多写少的,通过MVCC,读操作不用加锁,减少了锁冲突的概率,提高吞吐。select和事务又有啥关系呢?对于mysql,默认是auto-commit模式,如果不显示的开启一个事务,每个查询都被当作一个事务来执行。
  • mvcc怎么实现的
    • 每条记录后面增加两个version,创建version和删除version。
    • 对于select语句,只筛选那些创建version小于等于事务version(保证查询到的记录在当前事务开始之前就已经存在了),且删除version在当前version之后的(保证记录在当前事务开始的时候,未被删除)
    • insert 语句:插入新一行,创建version等于当前事务version
    • update语句:新插入一行,创建version等于当前事务version,之前行的删除version设置为当前事务version
    • delete语句: 当前行的删除version设置为当前事务version。

快照读和当前读

  • select语句读的是快照,通过读快照,在RR级别也不会有幻读,对于select for update这种当前读,通过next-key lock解决幻读问题。

refer

mysql 事务,锁,隔离机制的更多相关文章

  1. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  2. MySQL事务及隔离级别详解

    MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...

  3. mysql 事务锁超时时间 innodb_lock_wait_timeout

    mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...

  4. mysql数据库锁的机制-及事务事件

    事务隔离级别,脏读.不可重复读.幻读,乐观锁.悲观锁(共享锁.排它锁) 数据库事务具有四个特征,分别是原子性(Atomicity).一致性(Consistency).隔离性(Isoation).持久性 ...

  5. MySQL事务以及隔离级别

    前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...

  6. [转]MySQL事务学习-->隔离级别

    From : http://blog.csdn.net/mchdba/article/details/12837427 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性 ...

  7. MySQL事务及隔离级别(读书小结)

    标签: MySQL事务 隔离 0.什么是事务? 事务是指MySQL的一些操作看做是一个不可分割的执行单元.事务的特点是要么所有操作都执行成功,要么一个都不执行.也就是如果一个事务有操作执行失败,那么就 ...

  8. 面试官问你:MYSQL事务和隔离级别,该如何回答

    一.事务 事务是由一组SQL语句组成的逻辑处理单元,是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚.事务具有以下4个属性,通常简称为事务 ...

  9. mysql数据库锁的机制-one

    锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 举例 :以买火车票为例,火车票可面向广大消费者 ...

  10. MySQL——事务ACID&隔离级别

    数据库事务ACID&隔离级别 什么是事务 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一 ...

随机推荐

  1. multiset容器erase函数的误用

    <从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...

  2. UVa OJ 455 Periodic Strings

     Periodic Strings  A character string is said to have period k if it can be formed by concatenating ...

  3. 【近取 Key】Alpha - 项目展示

    项目与团队亮点 一.团队成员与分工简介 成员组成与分工 本团队由 6 名成员组成,其中有 3 名 PM,2 名后端开发人员与 4 名前端开发人员,由于组内成员数量有限,因此所有 PM 均需同时兼领开发 ...

  4. Qt - QLineEdit编辑框

    QLineEdit输入内容获取及合理性检查? 控件自带触发信息: void textChanged(const QString &);void textEdited(const QString ...

  5. ActiveMQ FileServer漏洞(详细)

    半个月前,巡检时发现服务器出现不明进程,对其进行了处理,由于当时没有做详细记录,在这里把大致过程描述一下. 症状: ps命令发现出现几个不明进程, 1.于/tmp下运行的,名称随机的进程.占用CPU高 ...

  6. /etc/ssh/sshd_config ssh自动断 cent7

    vim /etc/ssh/sshd_config ClientAliveInterval 60ClientAliveCountMax 8630000 ClientAliveInterval 30Cli ...

  7. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  8. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  9. 大数据开发-Flink-窗口全解析

    Flink窗口背景 Flink认为Batch是Streaming的一个特例,因此Flink底层引擎是一个流式引擎,在上面实现了流处理和批处理.而Window就是从Streaming到Batch的桥梁. ...

  10. Django(47)drf请求生命周期分析

    前言   一般我们写完序列化以后,我们就会开始写视图了,drf中我们一般使用CBV的方式,也就是类视图的方式,最基础的我们会使用from rest_framework.views import API ...