数据库事务学习

什么是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)时创建的锁,在读锁未释放前,也就是查询事务结束前,任何事务都不能对数据进行修改(获取数据上的写锁),直到已释放所有读锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值