MySQL事务基本特性和隔离级别
2022-08-12 00:07:19 0 举报
AI智能生成
一图讲清楚MySQL事务基本特性和隔离级别
作者其他创作
大纲/内容
基本特性
原子性
一个事务的操作要么全部成功,要么全部失败
原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的SQL
一致性
数据库总是从一个一致性的状态转到另一个一致性的状态
一致性一般由代码层面来保证
隔离性
一个事务的需修改在最终提交前,对其他食物是不可见的
隔离性由MVCC来保证
持久性
一旦事务提交,所做的修改就会永久保存到数据库中
持久性由内存+ redo log 来保证,MySQL修改数据同时在内存和 redo log 记录这次操作,事务提交时通过redo log 刷盘,宕机的时候可以从 redo log 恢复
隔离级别
read uncommit 读未提交
可能读到其他事务未提交的数据,也叫做脏读
read commit 读已提交
由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读
解决了脏读
repeatable read 可重复读
这是MySQL的默认级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,就是每次读取的结果都一样,有可能产生幻读
幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
幻读的正确理解
事务A查询“张三”,查询不到,插入又不成功,“张三”这条数据就像幻觉一样出现。这就是所谓的“幻读”。
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
“幻读”和“不可重复读”是一样,只不过“幻读”是针对数据的个数。这个理解是错误的
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
“幻读”和“不可重复读”是一样,只不过“幻读”是针对数据的个数。这个理解是错误的
“可重读”保证了同一事务内,多次查询的结果是一致的。也就是说,事务B插入数据提交事务后,事务A的查询结果也是100条,因为事务A在开启事务时,事务B插入的数据还没有提交。
解决了脏读、不可重复读
serializable 串行
解决了脏读、不可重复读、幻读
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
MVCC(Multi-Version Concurrency Control)
1、MVCC叫做多版本并发控制,是数据库控制并发访问的一种手段,实际上就是保存了数据在某个时间节点的快照
2、我们每行数据实际上隐藏了两列,创建时间版本号、过期(删除)时间版本号,每开始一个新的事务,版本号都会自动递增
3、MVCC只在 读已提交(RC) 和 可重复度(RR) 这两种事务隔离级别下才有效
4、是 数据库引擎(InnoDB) 层面实现的,用来处理读写冲突的手段(不用加锁),提高访问性能
https://segmentfault.com/a/1190000039097849
https://segmentfault.com/a/1190000039097849
收藏
收藏
0 条评论
下一页