MySql数据库笔记(一)详解事物隔离级别

本文详细介绍了数据库的分类,包括关系型数据库和非关系型数据库的特点及常见类型,如Oracle、MySQL、Hbase和Redis。同时深入探讨了MySQL事务的四大特性:原子性、一致性、持久性和隔离性,以及四种事务隔离级别的概念和区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库的分类

在这里插入图片描述

关系型数据库

以表格的形式存在,以行和列的形式存取数据,关系型数据库这一系列的行和列被称为表,无数张表组成了数据库,常见的关系型数据库有 Oracle、DB2、Microsoft SQL Server、MySQL等。关系型数据库能够支持复杂的 SQL 查询,能够体现出数据之间、表之间的关联关系;关系型数据库也支持事务,便于提交或者回滚。

非关系型数据库

非关系型数据库也称为 NoSQL,也就是 Not Only SQL。
特点:非关系型数据库不需要写一些复杂的 SQL 语句,其内部存储方式是以 key-value 的形式存在可以把它想象成电话本的形式,每个人名(key)对应电话(value)。常见的非关系型数据库主要有 Hbase、Redis、MongoDB 等。非关系型数据库不需要经过 SQL 的重重解析,所以性能很高;非关系型数据库的可扩展性比较强,数据之间没有耦合性,遇见需要新加字段的需求,就直接增加一个 key-value 键值对即可。

MySQL 事务四大特性

  • 原子性(Atomicity):原子性指的就是 MySQL 中的包含事务的操作要么全部成功、要么全部失败回滚,因此事务的操作如果成功就必须要全部应用到数据库,如果操作失败则不能对数据库有任何影响。

  • 一致性(Consistency):一致性指的是一个事务在执行前后其状态一致。比如 A 和 B 加起来的钱一共是 1000 元,那么不管 A 和 B 之间如何转账,转多少次,事务结束后两个用户的钱加起来还得是 1000.

  • 持久性(Durability):持久性指的是一旦事务提交,那么发生的改变就是永久性的,即使数据库遇到特殊情况比如故障的时候也不会产生干扰。

  • 隔离性(Isolation):当多个事务同时进行时,就有可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read) 的情况,为了解决这些并发问题,提出了隔离性的概念。

事务隔离级别

如表所示:在谈事务隔离级别时,还需了解脏读,幻读,不可重复读的概念
在这里插入图片描述

  • 脏读:事务1 读取了事务 2 更新后的数据,但是事务 B 没有提交,然后事务 B 执行回滚操作,那么事务 A 读到的数据就是脏数据
    在这里插入图片描述
    例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。
  • 不可重复读:事务 1进行多次读取操作,事务 2 在事务 1多次读取的过程中执行更新操作并提交,提交后事务 1读到的数据不一致。
  • 在这里插入图片描述
    -例子中,事务2提交成功,因此他对id为1的行的修改就对其他事务可见了。导致了事务1在此前读的结果=1,第二次读的结果=2,两次结果不一致,是不可重复读。
  • 幻读:是’‘不可重复读’‘的一种特殊场景,当事务1两次执行’‘SELECT … WHERE’'检索一定范围内数据的操作中间,事务2在这个表中创建了(如[[INSERT]])了一行新数据,这条新数据正好满足事务1的“WHERE”子句。
    在这里插入图片描述
    如图事务1执行了两遍同样的查询语句,第二遍比第一遍多出了一条数据,这就是幻读

三者到底什么区别

脏读:指读到了其他事务未提交的数据。

不可重复读:读到了其他事务已提交的数据(update)。

不可重复读与幻读都是读到其他事务已提交的数据,但是它们针对点不同。

不可重复读:update。

幻读:delete,insert。

MySQL中的四种事务隔离级别

  • 读未提交:是最低的隔离级别,在这种隔离级别下,如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
    在这里插入图片描述因为事务2更新id=1的数据后,仍然允许事务1读取该条数据,所以事务1第二次执行查询,读到了事务2更新的结果,产生了脏读。

  • 读已提交:读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行,会对该写锁一直保持直到到事务提交。
    在这里插入图片描述
    分析脏读例子,事务2更新id=1的数据后,在提交前,会对该对象写锁,所以事务1读取id=1的数据时,会一直等待事务2结束,处于阻塞状态,避免了产生脏读。
    分析不可重复读例子,事务1读取id=1的数据后并没有锁住该数据,所以事务2能对这条数据进行更新,事务2对更新并提交后,该数据立即生效,所以事务1再次执行同样的查询,查询到的结果便与第一次查到的不同,所以读已提交防止不了不可重复读

  • 可重复读:可重复读指的是一个事务在执行的过程中,看到的数据是和启动时看到的数据是一致的。未提交的变更对其他事务不可见。它是InnoDb的默认隔离级别

  • 串行化:对于同一行记录,写会加写锁,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。高的隔离级别,所以能防住上诉所有问题,但因为是串行化的,所以效率较低

隔离级别由低到高

读未提交 < 读已提交 < 可重复读 < 串行化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值