mysql学习
一、数据类型
1.定点数类型 DECIMAL类型
DECIMAL(M,D)可以定义整数长度和小数长度,取值范围与Double类型新相同,但是有效精度取决于M和D
2.字符串类型 char(M)和varchar(M)
主要讲讲他们的区别:char(M)长度不可变,不管你输入多长的字符串,都占M的长度,而varchar(M)长度是可以变的,你输入多大就占长度+1,只是限制到M。
这里注意一下:这里的M就是实际字符个数(不管是数字,汉字还是英文),Mysql屏蔽了具体存储细节
3.文本类型,用来存储大文本数据,如:评论,文章,详情介绍
主要有:TINYETEXT,TEXT,MEDIUMTEXT和LONGTEXT
4.时间类型,用来存储时间,可以输入字符串类型和数组类型
(1)year:年份,可以输入‘2001’也可以2001,也可以输入两个数,会自动补全。
插入数字0:显示为0;而输入字符串’0’:显示为2000
(2)time:时间,显示形式为’HH:DD:MM’,无论输入都会转化为相应格式,可以用CURRENT_TIME或NOW()输人当前系统时间
输入字符串’D HH:DD:MM’会得到:D*24+HH:MM:DD,D表示日取0-34之间的值
(3)datetime:显示形式为’YYYY-MM-DD HH: MM:SS’,用now()输入当前系统时间
(4)timestamp:显示形式为’YYYY-MM-DD HH: MM:SS’,用CURRENT_TIMESTAMP输入当前系统时间
不管输入Null还是没有输入时,都会保存系统当前时间
二、约束
约束条件 | 说明 |
---|---|
PRIMARY KEY | 主键约束,唯一标识对应的记录 |
FOREIGN KEY | 外键约束 |
NOT NULL | 非空约束 |
UNIQUE | 唯一性约束 |
DEFAULT | 默认值约束,设置字段的默认值 |
以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。 | |
设置也简单,在创建表时,在字段后面加上关键字即可 |
外键–保证数据的完整性和统一性
设置外键的字段的数据存在于关联的表中的相应字段,即从表中的外键数据,在主表中的数据相对应
设置外键方法:
- 在创建数据表时语法:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段) - 将创建数据表创好后语法:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
注意:
1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题
主键一些注意事项
InnoDB的数据文件本身要按主键聚集,即主键就是聚簇索引
在存储引擎为InnoDB时(聚集索引时必须的)
主键就是聚集索引,
如果没有主键被定义,那么该表的第一个唯一非空索引被作为主键作为聚集索引
如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
自增字段作为主键是很好的选择
三、truncate 和delete的区别
- delete是DML,而truncate是DDL语言
- delete删除表中数据时,涉及到事务处理:回退(缓存)、提交、撤退,而truncate不涉及。也因此,删除大批量数据时delete删除速度比truncate慢,truncate删除后不能撤销
- delete能加where,而truncate不能
- delete操作可能激活触发器的处理,而truncate不会
- delete:可以按照业务逻辑、按照一定的先后顺序可以删除相关表中的数据(先删从表再删主表,因为如果先删除主表数据,那么从表与之对应的数据就失去了关联)
truncate:不能删除由 foreign key 约束引用的表(主表)
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)即不能删除主表中的数据
四、查询
- distinct 关键字只能用在select的第一个所查列名之前
- select 后出来可以写* ,列名还可以接常数,作为标记,还可以用加减乘除
五、函数
- 聚合函数:只有SELECT子句、HAVING子句和ORDER BY子句中能够使用聚合函数。在WHERE子句中使用聚合函数是错误的
常见聚合函数:count();max();min();sum();avg() - 字符串函数:concat(),length(),upper(),lower()
- 数学函数:绝对值:ABS();向下取整;FLOOR();向上取整CEILING();
六、多表连接查询
- 交叉连接cross join(笛卡尔连接),返回所有交叉数据行,不需要
有on 字段=字段 - 内连接inner join,需要有on连接条件,只返回匹配的数据行
- 外连接
(1)左连接left join 以左表为基础表进行查询,返回左表中全部数据,以及右表中匹配的数据,不匹配的右表对应字段填null
(2)右连接right join 同上
(3)全外连接full join 两个表中数据都有,不存在左表数据或右表数据的填NULL
查询时group by必须位于where后,order by前
七、索引
索引是帮助MySQL存储引擎高效获取数据的数据结构,就像书前的目录。索引是需要占物理空间的,存储在磁盘上的文件中(可能存储在单独的索引文件中(MyISAM),也可能和数据一起存储在数据文件中(InnoDB))
索引是在存储引擎中实现的,每个存储引擎中的索引都不一定完全相同
在语句之前用explain可以看到索引使用情况
- 查看索引
show index from tablename
1.索引的分类
- 数据结构分类
InnoDB myisam memory B+tree索引 支持 支持 支持 Hash索引 否 否 支持 Full-text索引 支持(5.6.4) 支持 否
-
B+tree索引
多叉树,非叶子节点只会存储键值,非叶子节点存储实际值(数据或数据地址下文所说的聚集索引,非聚集索引等)。叶子节点之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的
注意- 非叶子节点上可以存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树也就会变得更矮更胖。这样一来我们查找数据进行磁盘I/O的次数就会大大减少,数据查询的效率也会更快。
- 所有数据记录都有序存储在叶子节点上,就会使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
- 数据页之间、数据记录之间都是通过链表连接的,有了这个结构的支持就可以方便的在数据查询后进行升序或者降序操作。
- 模糊匹配like,以%开头会失效
-
Hash索引
通过数组+链表+红黑树实现,先将索引字段值转换为hash值,通过hash函数,映射到对应的地址中。如果多个索引字段值对应一个地址,则说明出现了hash碰撞。那么这多个字段对应的行数据地址就会以链表或者红黑树的形式连接在这个地址中。hash索引一般是为了加快查找速度。
自适应hash索引
Innodb存储引擎检测到某个二级索引不断被使用,那么他就会根据这个二级索引,在内存上根据二级索引B+树的结构创建一个哈希索引,用于加速搜索。自适应哈希索引创建后,就会在等值查询的时候直接查询哈希索引,哈希索引上有数据的地址,这样就省下了二级索引跟主键索引的搜索时间
注意- HASH索引不支持通过部分索引列来查询,因为hash(A)和hash(B)和hash(A,B)不相等(哈希碰撞除外)。
- HASH索引仅支持精确匹配查找(=、IN()、<=>),不支持范围查找(>、<),也不支持!=和<>。
- 要尽量减少hash碰撞。因为哈希碰撞是以链表和红黑树进行处理的,所以当哈希碰撞很多时,链表和红黑树会边长,查询是会变的缓慢,因为必须要遍历链表中对应的所有数据行进行匹配,同样更新索引的效率也会受到影响,导致数据的新增、修改、删除速度变慢
- 无法利用索引完成排序操作
-
fulltext索引(全文索引)
是将存储于数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。
这里主要讲数据结构:通过倒排索引(一种数据结构)实现
**倒排索引:**将文档中的单词作为索引,反向查找到文档
- 按物理存储方式分类(一般在InooDB存储引擎中提到)
- 聚簇索引(聚集索引)
索引和数据行存储在一起,是一种数据存储方式,因为叶子节点存储的就是完整的表数据,按聚集索引查找时,查找到叶子节点就能得到结果,一个表只有一个聚集索引
聚簇索引的优缺点:
优点:
(1)数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
(2)聚簇索引对于主键的排序查找和范围查找速度非常快
缺点:
(1)插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
(2)更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般【定义主键为不可更新】。
(3)二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据 - 非聚簇索引(二级索引辅助索引)
处理聚集索引以外的索引(索引文件和数据文件分开),即叶子节点存储的不是完整表数据,在InooDB中,叶子节点存储的是对应的聚集索引对应的列值,有可能会需要用得到的数据到聚集索引中查找(此过程成为回表查询)
索引覆盖:即不需要进行回表的情况,select后面的字段,在二级索引中就能直接得到
MyISM的主键索引和二级索引的结构一样,叶子节点存储的都是主键值+数据记录地址。不过主键索引的key值唯一,二级索引可重复
- 字段功能分类
- 主键索引
建立在主键字段上的索引,一张表最多只有一个主键索引,一个主键索引可以包含多个字段,非空且唯一。在InooDB存储引擎中即为聚集索引,而在MyISM主键索引叶子节点为:主键值+数据记录地址。 - 唯一索引
建立在UNIQUE字段上的索引就是唯一索引,一张表可以有多个唯一索引,索引列值允许为null - 普通索引
主键索引和唯一索引要求字段为主键或unique字段,而那些建立在普通字段上的索引叫做普通索引,既不要求字段为主键也不要求字段为unique。
创建索引选择字段原则:
(1)经常需要排序、分组和联合操作的字段建立索引
(2)常作为查询条件的字段建立索引
(3)尽量的扩展索引,不要新建索引:比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
(4)Distinct字段,创建索引
(5)区分度高的列适合作为索引
(6)使用最频繁的列放到联合索引的左侧
[原因]最左前缀匹配原则:即最左优先,在检索数据时从联合索引的最左边开始匹配。如:建立一个 3 列联合索引 (col1, col2, col3),则已经对 (col1)、(col1, col2)、(col1, col2, col3) 上建立了索引,查询时使用col2,col3是不会走索引查询的
(7)B+树中,尽量使用自增主键作为索引。
因为自增索引是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率 - 前缀索引
前缀索引是指对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引,而不是在整个字段上建索引。 - 全文索引(fulltext索引)
MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
Mysql支持三种模式的全文检索模式:
(1)自然语言模式:通过match against 传递某个特定的字符串进行检索(字符有最小搜索长度和最大搜索长度限制)
语法:
select * from 表名
where match(col1,col2) against('xxx xxx');
(2)布尔模式:可以为检查的字符串增加操作符
+ 必须包含该词
- 必须不包含该词
> 提高该词的相关性,查询的结果靠前
< 降低该词的相关性,查询的结果靠后
* 通配符,只能接在词后面
select * from 表名 where match(col1) against('x*' in boolean mode);
(3)查询扩展模式:当查询的关键字太短,用户需要隐含知识时进行,以便在用户提供的关键字很短时扩大搜索结果
SELECT * FROM 表名
WHERE MATCH(col1) AGAINST('1992' WITH QUERY EXPANSION);
- 索引包含的字段个数分类
- 单列索引
建立在单个列上的索引 - 联合索引(复合索引)
建立在多列上
遵循最左匹配原则: 即最左优先,在检索数据时从联合索引的最左边开始匹配。如:建立一个3 列联合索引 (col1, col2, col3),则已经对 (col1)、(col1, col2)、(col1, col2, col3) 上建立了索引,查询时使用col2,col3是不会走索引查询的
2.索引优缺点:
优点:
- 加快数据的查询速度
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
- 加速表和表之间的连接;
- 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
- 创建索引会占用物理空间
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
3.索引注意事项
- 不要在索引列上面做任何操作(计算、函数),会导致索引失效而转向全表扫描
- SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好
consts:单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
ref:使用普通的索引(Normal Index)。
range:对索引进行范围检索。
当 type=index 时,索引物理文件全扫,速度非常慢。 - 模糊查询like,不要以%开头
- 注意最左匹配原则
- is null, is not null无法使用索引
八、引擎
mysql的数据库有很多可插拔的存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。主要存储引擎是MyISAM、InnoDB
存储引擎是指定在表之上的,即一个库中的每一个表都可以指定选择存储引擎;
相关命令:
- 查看引擎
show ENGINES
- 更改引擎
ALTER TABLE userinfo ENGINE=InnoDB;
九、视图
视图(view)是一种虚拟表,是一个逻辑表,本身并不包含数据。其内容由查询定义
- 定义视图:
CREATE VIEW 视图名 AS SELECT语句
注意:
如果视图的每一行,是与物理表一一对应的则可以更新
如果视图的行是由物理表多行经过计算得到的结果,视图就不可以更新
十、触发器
在满足定义条件时触发,并执行触发器中定义的语句集合
MySQL创建以下六种触发器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE
- 创建触发器语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称
tirgger_time:触发时机,<BEFORE或AFTER>
trigger_event:触发事件,<INSERT、DELETE或UPDATE>
tb_name:建立触发器的表名
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
十一、分区分库分表
为什么要分区分库分表呢?
因为数据量过大,I/O过大
-
分区
MySQL的物理数据,存储在表空间文件(.ibdata1和.ibd)中,这里讲的分区的意思是指将同一表中不同行的记录分配到不同的物理文件中,几个分区就有几个.idb文件。逻辑上看仍是一张表,但底层由多个物理区块组成
使用关键字PARTITION 分区
(1)RANGE分区:基于一个给定连续区间的范围,把多行分配给分区。
(2)LIST分区:类似于按RANGE分区,区别在于LIST分区是基于离散值集合来进行区分,RANGE是基于给定连续区间范围分区。
(3)HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
(4)KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
(5)Composite(复合模式):以上模式的组合使用 -
分表
把一张表按一定的规则分解成多个具有独立存储空间的实体表。分表可以将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与子表。与分区不同的是,分表确实最后得到的是多张表
(1)水平分表:表字段还是一样,但是数据被分开成多张表
(2)垂直分表:一张大表根据逻辑关系分成多个子表,每个子表至少有一个相同的字段,将多张表进行关联
- 分库
把一个库拆成多个库,多个库就能部署到不同的服务器上。
(1)水平分库:水平分库和水平分表紧密联系,水平分库就是将单个库中的表作水平分表,然后将子表分别置于不同的子库当中,独立部署。
(2)垂直分库:和垂直分表类似,拆分表,将一个库中的表按照不同维度进行分类,拆分到不同子库中去
十二、事务
数据库中的事务是指对数据库执行一批操作(一个SQL或多个SQL),是一个原子操作,在一个事务中要么全部执行成功,要么全部失败,不会存在部分成功的情况。只有使用了 Innodb 数据库引擎的数据库或表才支持事务
1. 事务的特性(ACID)
-
原子性(Atomicity)
原子性是从最终结果来看的,即事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败。 -
一致性(Consistency)
一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。
如:转帐,从帐户A转一笔钱到帐户B上,如果帐户A上的钱减少了,而帐户B上的钱却没有增加,那么我们认为此时数据处于不一致的状态。 -
隔离性(Isolation)
一个事务的执行不能被其他事务干扰。数据库允许多个并发事务同时对其数据进行读写和修改的能力,并发事务的操作是隔离的,且各个事务之间不能互相干扰,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务的隔离级别:
读未提交:read uncommitted
读已提交:read committed
可重复读:repeatable read
串行化:serializable -
持久性(Durability)
一个事务一旦提交,对数据库中数据的改变就是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的,所以commit之前要慎重。
2.事务控制语句
- BEGIN 或 START TRANSACTION 显式地开启一个事务;
- COMMIT 提交事务,并使已对数据库进行的所有修改成为永久性的;
- ROLLBACK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
- SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT,可以用此来指定回滚到哪个点。
- RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
- ROLLBACK TO identifier 把事务回滚到标记点;
- SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
3.并发事务产生的一致性问题
- 更新丢失:当多个并发事务同时对数据更改时,首先提交的更改会被覆盖掉;
- 脏读:A事务更新了但没提交,B事务此时读的就是A事务更新的数据,如果此时A事务回滚,那么B读的就是脏数据
- 脏写:一个事务修改了其它事务未提交的数据。
- 可重复读:在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的(针对UPDATE)。
- 不可重复读:每次读到的都不同,都是别的事务提交的更改了的数据(针对UPDATE)
- 幻读:幻读是指的是在一个事务执行过程中,读取到了其他事务新插入(针对insert,delete)行,导致两次读取的结果的数量不一致。
不可重复读和幻读的区:不可重复读是读到的是其他事务修改或者删除的数据,而幻读读到的是其它事务新插入的数据。
隔离级别 | 脏读 | 不可重复读 | 幻读 | 描述 |
---|---|---|---|---|
读未提交:read uncommitted | 1 | 1 | 1 | 允许读取其他事务未提交的数据 |
读已提交:read committed | 0 | 1 | 1 | 只允许读取其他事务已提交的数据 |
可重复读:repeatable read | 0 | 0 | 0 | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新 |
串行化:serializable | 0 | 0 | 0 | 确保事务可以从一个表中读取相同的行,其他事务不能对该表进行更新删除插入操作 |
这四种从上到下隔离级别越来越强,事务的并发性越来越低 |
4.MySQL中事务默认隐性的
隐式事务:执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。
显示事务:开发者自己控制开启、提交或回滚。
mysql中事务默认是隐式事务,
5.MVCC(多版本并发控制)
实现数据库的并发访问,处理读写请求,做到在发生读写冲突时不用加锁,这个读指的是快照读。读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了MVCC只在 READ COMMITTED (读已提交) 和 REPEATABLE READ (可重复读) 两个隔离级别工作 其他两个不兼容因为 READ UNCOMMITTED (读未提交) 总是读取最新的数据行, 而不是符合当前事务版本的数据行。而 SERIALIZABLE (可串行化) 则会对所有读取的行都加锁
当前读和快照读
1.当前读:共享锁,排他锁这些加锁操作都是一种当前读,当前读就是读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
2.快照读:不加锁的非阻塞读功能;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;快照读基于多版本,快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;。
MVCC实现
mvcc的实现依赖于 undolog,隐藏字段,read view来实现的。
- undo log(回滚日志)
在进行insert,delete,update操作的时候产生的方便回滚的日志
- 进行insert操作的时候,产生的undolog只在事务回滚的时候需要,并且在事务提交之后可以被立刻丢弃。
- 进行update和delete操作的时候,产生的undolog不仅仅在事务回滚的时候需要,在快照读的时候也需要,所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(当数据发生更新和删除操作的时候都只是设置一下老记录的deleted_bit,并不是真正的将过时的记录删除,因为为了节省磁盘空间,innodb有专门的purge线程来清除deleted_bit为true的记录,如果某个记录的deleted_id为true,并且DB_TRX_ID相对于purge线程的read view 可见,那么这条记录一定时可以被清除的)。
-
隐藏字段
每条记录中有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段
DB_TRX_ID:6字节,最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:7字节,回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个旧版本
DB_ROW_JD:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个6字节的row_id -
Read View
Read View是事务进行快照读操作的时候生产的读视图,在该事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护系统当前活跃事务的id,事务的id值是递增的(事务ID查询就不会新增,只有DML语言才会导致事务ID增加。)。用Read View(读视图),用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也可能是该行记录的 undo log 日志里的某个版本的数据。
首先要知道Read View中的三个全局属性:
- trx_list:维护Read View生成时刻系统正活跃的事务ID列表,未提交事务
- up_limit_id:记录trx_list列表中事务ID最小的ID,最初修改改记录的ID
- low_limit_id:Read View生成时刻系统尚未分配的下一个事务ID,目前出现的最大事务的ID+1
MVCC就是 RC 隔离级别 下,每个快照读都会生成新的 Read View 以及快照,而在 RR隔离级 别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。
十三、锁
锁感谢大佬
- 常见锁
- 表锁:操作对象是数据表。是系统开销最低但并发性最低的一个锁策略。事务T对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
- 行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的。行级锁对系统开销较大,但处理高并发较好。
- 读锁(共享锁):S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A其他事务只能再对A加S锁,而不能加X锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。
- 读锁(共享锁):S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A其他事务只能再对A加S锁,而不能加X锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
十三、锁
锁感谢大佬
- 常见锁
- 表锁:操作对象是数据表。是系统开销最低但并发性最低的一个锁策略。事务T对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
- 行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的。行级锁对系统开销较大,但处理高并发较好。
- 读锁(共享锁):S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A其他事务只能再对A加S锁,而不能加X锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
- 写锁(排他锁):X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。