该篇文章适合哪些刚对Mysql有一些点了解的同学。记得当时我自己学Mysql的时候,简单学点增删改查,连接查询等等就以为学明白了,殊不知Mysql学问多着,离面试要懂得东西还远远不够。就我所懂得皮毛,给大家大略简述一下。
Mysql锁
应该学Mysql的时候都了解过锁,读锁啊,写锁这些,下面我将系统的Mysql锁有哪些。Mysql锁分为全局锁,表锁,行级锁。
全局锁:
可以简单理解就是一个数据库锁,锁住整个数据库,有什么用处勒?就比如有时候我们数据需要备份或者迁移,如果我们不使用全局锁,在允许一些写操作的话就会有可能造成数据不一致的问题。举个例子,在一个商城系统中,如果我们在数据备份的时候,一个用户来下单了,此时插入一条订单数据并同步在数据备份中,用户在数据备份结束的时候后支付完该订单,此时备份的数据并不知道这个操作,这就是数据不一致的问题。
表级锁:
表锁:故名就是锁住整张表,不允许表进行操作(分为排他锁,共享锁)
意向锁(可以看完后面行锁再来看):意向锁是一种不与行级锁冲突的表级锁,它本身是相互兼容的,但他和其他表锁存在互斥的问题。为什么会有这个锁?当我们对一个表的行记录加上锁,我们还想对这个表加表锁,此时我们需要去遍历检查每一个记录是否存在锁来避免行锁和表锁的冲突,一行一行解决检查是在太低了。引入意向锁就可以避免遍历,只需要判断当前表锁和意向锁的互斥问题。
元数据锁:为了防止DML和DDL语句的冲突。就我们正常执行DDL语句的时候,你总不希望你的表结构在这个时候被改变吧。
行级锁
行锁:锁住整条行记录,一般我们执行一些增删改的时候会自动加上
间隙锁:锁住两条记录之间的间隙。当我们根据唯一索引查询一条不存在的记录时,此时就会为该不存在的记录位于哪两个记录间的间隙加上锁。目的是为了解决幻读(幻读我会在后面讲)
临建锁:存在于非唯一索引中,该类型的每条记录的索引上都存在这种锁,它是一种特殊的间隙锁,锁定一段左开右闭的索引区间。
事务
事务就是一些sql的集合,为什么要有事务,你想想如果没有事务,此时你有一万条sql要执行,执行一般服务突然就挂了,那你怎么知道我的这些sql到底执行到哪一条?事务就是用来保证这些sql集合执行要么全部不执行要么全部执行成功,这么说明白吧。
事务的四大特性
原子性:事务里的语句要么全部执行,要么全部不执行。
隔离性:每个事务之间运行互不干扰。
持久性:所有事务造成的结果都会保留并存储。
一致性:事务执行前后的数据完整性是一致的。比如两个人互相转账,转帐前两个人的余额和转账后的一致的。
一般来说,前三个时手段,最后一个是结果。
Mysql是如何保证这些特性的?
日志听过吧,我们每个电脑都有自己的日志,Mysql作为软件同样也有,用来记录我们执行操作。常见的有Redo log ,Undolog ,bing log
Undo log回滚日志:
它实现了事务中的原子性,主要用于事务回滚和多版本并发控制(MVCC后面单独一篇文章讲)。当一个事务开始时,InnoDB会生成一条回滚日志,记录下当前数据的状态,以便在事务失败或回滚时能够恢复到原来的状态。此外,回滚日志还支持MVCC,允许不同事务看到不同版本的数据,从而提高并发处理能力.
Redo log重做日志
他确保了事务的持久性和一致性,每当一个事务提交时,InnoDB会首先将该事务涉及修改的数据页的所有变更记录到重做日志缓冲区(redo log buffer),然后定期或在特定条件下将其刷新到磁盘上的重做日志文件中。这样即使在事务提交后发生系统崩溃,也可以通过重做日志恢复未完成的事务,保证数据不会丢失。
Binlog log 二进制日志
主要记录着对数据库修改操作的记录 比如 insert deleted。
Mysql存储引擎
存储引擎就是针对表的存储的一种架构,比较常见的有MyISAM,Innodb两者区别就是innodb支持事务,行锁,和外键。
事务的隔离级别
读已提交,读未提交,可重复读,可串行化。在Innodb引擎下默认可重复读,在事务并发的情况下存在以下问题:
每个隔离级别分别解决了什么问题以及如何解决的下面我们来详细聊聊
1.在读未提交的隔离级别下解决了脏写的问题。
显然第二种结果是通过加行锁来解决脏写问题
2.在读已提交的隔离级别下解决了脏读的问题。
他是通过Mvcc(版本控制来解决的)这里给出出现的问题,解决方案看下节文章
显然读到别人未提交的事务这是不允许的。
3.在可重复读的隔离级别下解决了不可重复读的问题。
在同一个事务中读取前后不一致也是不允许的,违反了事务隔离性,这里我们为线程1读操作创建快照读,以后都读这个快照。
4.在可序列化的情况下解决了幻读的问题。
查的时候不存在,插入的时候插入失败,这就是幻读。
还记不记得我们上面说的间隙锁,当根据主键查询不存在的数据时,就会为该主键值所在的两个记录的间隙加上锁,这样线程二就会被阻塞,解决了幻读的问题
ok啊先到这里结束下期再见。