MySQL 事务锁基础部分详解

本文转载于 SegmentFault 社区

作者:哈基石


MySQL

基础部分

Char 和 Varchar 数据类型的差别差别

  1. char 类型用于存储定长字符串,varchar存储可变长子字符串

  2. varchar 需要1-2个字节存储长度信息

  3. char 在存储的时候会补空格到达指定长度来存储,varchar 则不需要

  4. char 在检索的时候会删除尾部的空格(可增加配置参数 PAD_CHAR_TO_FULL_LENGTH 保留尾缀空格)

  5. char 的存取速度要比 varchar 快,而 varchar 的空间利用率会更高

    参考文档:https://mp.weixin.qq.com/s/qkfIJwLHCj4b1IqbZk-7IQ


MySQL 的数据类型

  1. 整数类型

    整数类型(whole number)
    tinyint、smallint、medinuint、int和bigint,分别使用8,16,24,32,64位存储空间。含有可选 unsigned 属性,表示不允许为负数

    实数类型(real number) 

    是带有小数部分的数字,float和double decimal只是一种存储类型

    字符串类型

    varchar 和 char

    如何存储在硬盘和内存中与存储引擎有关。
    varchar(200)与char(5)存储hello 的开销事一样的,使用 char 会更有优势,更长的列会消耗更多的内存,因为 MySQL 通常会分配固定大小的内存来保存内部值。最好只分配真正需要的空间

    BLOB 和 TEXT 类型

    BLOB 和 TEXT 都是为存储很大的数据而设计的字符串类型,分别采用二进制和字符方式存储

    枚举(ENUM)类型

    枚举可以把一些不重复的字符串存储成一个预定义的集合。MySQL 存储枚举的值非常进程,会将列表值的数量雅座到一个或两个文件中。MySQL 真正存储的是整数,而不是字符串。

    在特殊情况下,把 char/varchat 列与枚举列进行关联,可能比 char/varchar 关联要慢

    BLOB 与 TEXT 之间不同事 BLOB 类型存储的是二进制数据,没有排序规则或字符集。而 TEXT 类型有字符集和排序规则

  2. 日期和时间类型

    MySQL 能存储的最小时间粒度为秒(可以使用微秒级的粒度进行临时运算)

    datetime表示范围到9999年,而 timestamp 表示范围到2038年。
    timestamp 占用4字节,datetime 占用8字节。timestamp 在时间处理上更方便一些

    参考地址:https://segmentfault.com/a/119000001739360


事务的特性 ACID

  • 原子性(atomicity) 一个事务为不可分割的最小工作单元,要么全部提交成功,要么全部回滚,不可能只执行一部分,这就是事务的原子性

  • 一致性(consistency) 数据库从一个一致性状态切换到另一个一致性状态

  • 隔离性(isolation) 一个事务在提交之前,对其他事务是不可见的。

  • 永久性(durability) 一旦事务提交,那么所做的修改将会永久存储在数据库中


事务的隔离级别

隔离级别的定义

  • READ UNCOMMITED(未提交读)脏读
    事务中的修改即使没有提交,对其他事务都是可见的。会出现脏读(Dirty Read)的情况。

  • READ COMMITTED (提交读)不可重复读
    一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。也叫做不可重复读(nonrepeatable read),因为两次同样的查询,可能会存在不同的结果

  • REPEATABLE READ(可重复读)MySQL 默认的事务隔离级别
    当某个事务在读取某个范围内的记录时,另外一个事务在这个范围内插入了新的记录,当之前的事务再次读取这个范围内的数据时,会产生幻行(Phantom Row)称为幻读
    也可以说 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象称为“幻读”。

  • SERIALIZABLE (可串行化)最高的隔离级别
    在读取的每一行数据都上锁。导致导量的超时和等待锁的问题。

MySQL 事务锁基础部分详解_第1张图片

  • 隔离级别的列表

隔离级别           脏读   幻读   不可重复读
未提交读(RUC)       是     是      是
已提交读(RC)        否     是      是
可重复读(RR)        否     是      否
可串行化            否     否      否


>   参考地址:https://segmentfault.com/a/1190000016680062
  1. 脏读 一个事务读取到了另一个事务未提交的数据

  2. 幻读 幻读就是一个事务读到了另一个事务insert的数据

  3. 不可重复读

    不可重复读就是多次读取统一数据返回的结果不一致。同脏读不同,这是读取已经提交的数据;同幻读也不同,这边是更新数据,幻读是插入数据。




MySQL 锁的基本类型

读写锁

  • 读锁也叫共享锁,相互不堵塞

  • 写锁也叫排它锁,一个写锁会阻塞其他的读锁和写锁


锁粒度

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

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

  • 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

参考地址:
https://zhuanlan.zhihu.com/p/29150809

https://segmentfault.com/a/1190000011460640

https://www.cnblogs.com/jpfss/p/8890250.html

https://segmentfault.com/a/1190000016685629

你可能感兴趣的:(MySQL 事务锁基础部分详解)