MySQL事务的特性、隔离级别、脏读和幻读

文章目录

  • 前言
  • 一、什么是脏读、不可重复读、幻读
  • 二、事务的隔离级别
  • 三、事务的四大特性(acid)
  • 总结


前言

数据库是后端最核心的工具之一,分关系型数据库和非关系型数据库,关系型主流是MySQL和PgSQL,今天就以MySQL为例,讲一下数据库事务相关的知识点。


一、什么是脏读、不可重复读、幻读

在介绍事务的特性和隔离级别之前,首先来看一组非常容易混淆的概念:幻读、脏读和不可重复读。

(1)脏读

  • 一个事务可以读另一个未提交的已修改事务的内容;
  • 事务a,事务b,其实事务b做了修改,但是没有提交,事务a可以读到事务b这个修改,但是后面事务b回滚了修改,那么这个数据就不存在了,这就是脏读;
  • 脏读只有在读未提交隔离级别下存在。

(2)不可重复读

  • 一个事务只能读到其他的已提交的事务的修改内容;

  • 事务a,事务b,事务b修改了,并且已经提交,此时事务a可以读到一个结果,此时事务b又修改了,并且提交,此时事务a又读到了一个不同的结果,这个就是不可重复读;

  • 不可重复读在读未提交和读提交隔离级别都存在。

(3)幻读

  • 一个事务提交后,才可以读到另一个提交后事务的修改,但是,如果同一个查询,其他事务添加了一个符合该查询的修改,那么每次查询的结果不同;

  • 事务a,事务b做了修改并提交,a提交后可以读到修改,此时b又修改了,a读到的数据和上一次不同,比如a要求平均数,但是b一直添加,所以a每次得到的平均数不同。

二、事务的隔离级别

首先,设置事务的隔离级别是为了在并发过程中,使得不同的事务之间相互隔离,互不影响。

隔离级别有四个,隔离级别越高,可靠性越高,但是并发越少,反之并发越高;

可靠性从小到大,隔离级别从低到高分别是:

(1)读未提交

  • 可以读到其他事务未提交的修改;

  • 存在脏读、不可重复读、幻读。

(2)读已提交

  • 只能读到其他事务已经提交的修改;

  • 解决了脏读,但存在不可重复读和幻读。

(3)可重复读(MySQL的innodb默认采用)

  • 两个事务都提交之后才可以读;

  • 解决了脏读、不可重复读,但存在幻读。

(4)串行

  • 最高级别的隔离,大量使用锁,来控制资源的访问;

  • 解决了脏读、不可重复读、幻读的问题。

三、事务的四大特性(acid)

(1)一致性

  • 一致性是指事务前后都处于一致性的状态,比如a给b100快,事务结束后,a-100,b+100,就保持了一致性;

  • 一致性是acid最基础最重要的特性,其他三个都是为了实现一致性;

  • 一致性的实现,首先要利用redo 和 undo保证原子性和持久性,再利用乐观锁和悲观锁保持隔离性;

(2)原子性

  • 原子性是指,一个事务要么全部完成,要么全部不完成;

(3)隔离性

  • 在并发情况下,多个用户访问数据库,需要创建多个事务,隔离性保证了事务之间是互不影响的,相互隔离的;

  • 可以通过锁机制和设置隔离级别来保证隔离性。

(4)持久性

  • 持久性是指事务提交之后,改变是永久的,就算停电宕机,也不会改变结果;

  • 原子性和持久性是由undo log 和 redo log 来实现的,在事务对数据修改之前,undo log会保存修改前的数据,在数据修改后并且提交后,redo log会保存提交后的数据,如果事务没有完成,那么就会读取undo log的内容,回到修改之前的状态,实现原子性。如果提交后,断电宕机,那么重新连接的时候,会读取redo log的日志文件,恢复到提交后的状态。

总结

本文介绍了一下MySQL事务的四大特性、隔离级别和幻读脏读等概念。

本系列为基础知识分享,日更,有任何问题可以私聊或评论博主哦!
希望给各位找工作和工作中的小伙伴提供一点微博的帮助,如果觉得有帮助,欢迎点赞评论收藏关注~

你可能感兴趣的:(MySQL,关系型数据库,mysql,数据库,java)