什么是mysql事务?事务四大特性?四大特性具体怎末实现的?
那Innodb是如何解决幻读问题的呢?
说一下MySQL中你都知道哪些锁?
那你来谈一谈你对表锁、行锁的理解吧
那你再说一下按锁级别划分的那几种锁的使用场景和理解吧?
①事务是sql执行最小的操作单元,它具有原子性,一致性,持久性,隔离性,事务的使用,可以使数据一次性全部成功,或者全部失败,它可以保证数据安全,不会出现一系列异常问题
②原子性:一个事务是一个不可分割的工作单位,事务中的操作要么都做,要末都不做
一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态,要末数据全部更新成功,要末全部更新失败,一致性和原子性密切相关
持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃(磁盘不出问题),修改的数据也不会丢失
隔离性:一个事务在操作并且未提交时,不会影响到其他事务,并且对其他事务是不可见的
③具体实现:
原子性:原子性利用Innodb的undo log滚日志日志实现,当事务回滚时能够撤销所有已经成功执行的sql语句,在执行sql之前时他会相应记录你要回滚的日志信息。比如sql删除一条,那摩回滚日志就记录一条插入旧数据,一旦事务执行失败或调用了rollback,那摩他就取出回滚日志对应信息,恢复原有数据
一致性:是一种概念名词,它实际上是依靠原子性、隔离性、持久性最终实现保证一致性
持久性:讲持久性先说下磁盘,MySQL的表数据是存放在磁盘上的,存取是要经过磁盘IO的,数据量大IO比较吃性能,所以 InnoDB 提供了缓冲池(Buffer Pool),
读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取在放入缓冲池;
写数据:会首先写入缓冲池(同时redo log中记录这次操作),缓冲池中的数据会定期同步(空闲时或者,写满时要腾空间)到磁盘中
如果写入缓冲池还为到磁盘宕机了怎末半?他会 通过redo log重做日志恢复磁盘数据,再根据undo log和binlog归档日志内容决定回滚数据还是提交数据。
隔离性:最复杂的一个,有四种隔离级别
读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。(别的事务指同一时间进行的增删改查操作)脏读问题
读提交:一个事务提交(commit)之后,它做的变更才会被其他事务看到。解决脏读(可以看到别人没提交的数据) 不可重复读问题
可重复读:一个事务执行过程中多次查询看到的数据,总是跟这个事务在启动时看到的数据是一致的。解决不可重复读问题(所谓不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致。还是以银行取钱为例,事务A开启事务-->查出银行卡余额为1000元,此时切换到事务B事务B开启事务-->事务B取走100元-->提交,数据库里面余额变为900元,此时切换回事务A,事务A再查一次查出账户余额为900元,这样对事务A而言,在同一个事务内两次读取账户余额数据不一致,这就是不可重复读。)(默认隔离级别)
串行化:就像单线程操作,不支持并发,解决幻读问题(所谓幻读,就是指在一个事务里面的操作中发现了未被操作的数据。比如学生信息,事务A开启事务-->修改所有学生当天签到状况为false,此时切换到事务B,事务B开启事务-->事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条自己没有修改过的数据,这就是幻读,就好像发生了幻觉一样。幻读出现的前提是并发的事务中有事务发生了插入、删除操作。)
那Innodb是如何解决幻读问题的呢?
MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的
通过next key lock实现给涉及到的行加写锁禁止更新写入,给行与行之间加间隙锁防止新增,(老版只有一个行锁,只能锁住现有行数据)
注意:next key lock在并发情况下也经常会造成死锁
说一下MySQL中你都知道哪些锁?
1.按照粒度分为表,页,行锁,以及特殊的全局锁
2.按照锁级别分为,共享(读)锁,排他(写)锁,意向共享(读)锁,意向排他(写)锁
3.innodb为解决幻读引入的Record Lock(行记录锁)
、Gap Lock(间隙锁)
、Next-key Lock(Record Lock + Gap Lock结合)
等;
4.面向编程的两种锁思想:乐观锁,悲观锁
那你来谈一谈你对表锁、行锁的理解吧
表锁:是MySQL各存储引擎中最大颗粒度的锁定,特点:实现逻辑非常简单,带来的系统负面影响最小,获取锁和释放锁的速度很快,有效避免死锁,对并发不友好,一般用于非事务性存储引擎myisam,memory,csv
行锁:力度最小,并发更友好,容易死锁,锁很多对系统资源消耗也是问题,innodb经常用行锁
表级锁更适合于以查询为主,行级锁高并发更新数据
全局锁:全库逻辑备份时有用到
那你再说一下按锁级别划分的那几种锁的使用场景和理解吧?
就像去住酒店,所有房间都可以看(共享(读)锁,如果有相中的就去办入住,那摩这个房间其他人就无权看房了排他锁(写)
意向读\写锁
,严格来说他们并不是一种锁,而是存放表中所有行锁的信息,就像我们在酒店,当我们预定一个房间时,就对该行(房间)添加 意向写锁,
同时会在酒店的前台对该行(房间)做一个信息登记,它维护表中每行的加锁信息,是共用的
原理上讲:
共享锁:又叫读锁,是读取操作(SELECT)时创建的锁,在读锁未释放前,也就是查询事务结束前,任何事务都不能对数据进行修改(获取数据上的写锁),直到已释放所有读锁