MySQL 基础知识(七)之事务

目录

1 事务的概念

2 事务的特性 ACID

3 事务的提交和回滚

4 事务的并发问题(脏读、不可重复读、幻读)

4.1 脏读

4.2 不可重复读

4.3 幻读

5 事务隔离级别


转载博文:

MySql事务及原理详解-鸿蒙开发者社区-51CTO.COMicon-default.png?t=N7T8https://ost.51cto.com/posts/11191

【数据库】快速理解脏读、不可重复读、幻读icon-default.png?t=N7T8https://blog.csdn.net/qq_33591903/article/details/81672260

1 事务的概念

  • 事务是数据库中最小的工作单元,是一个原子操作
  • 事务有一条或多条 SQL 语句组成
  • 在同一事务中,所有的 SQL 语句都成功执行时,整个事务成功!有一个SQL语句执行失败,则整个事务都执行失败!

2 事务的特性 ACID

  • 原子性 (Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束
  • 一致性 (Consistent):一方面,在事务开始之前和事务结束以后,数据库的完整性没有被破坏;另一方面,写入的数据必须完全符合所有的预设规则
  • 隔离性 (Isolation):不同的会话或线程,操作数据库的时候可能产生多个事务。如果同时操作一张表或同一行数据,必然产生并发或干扰操作。隔离性要求事务间对表或数据操作是透明的,互相不存在干扰的,通过这种方式保证一致性。
  • 持久性(Durable):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

3 事务的提交和回滚

        在事务的执行过程中,每一条 DML 操作都会被记录到“事务性活动的日志文件”中,我们可以提交事务,也可以回滚事务。提交事务 (commit) 会清空“事务性活动的日志文件”,将数据全部彻底持久化到数据库中,提交事务标志着事务的结束,是一种 SQL 语句全部成功的结束。回滚事务 (rollback) 会清空该事务之前所有的 DML 操作,并清空“事务性活动的日志文件”,回滚事务标志着事务的结束,是一种 SQL 语句全部失败的结束。

        MySQL 默认情况下是自动提交事务的,即每执行一条 DML 语句,提交一次事务。可以通过 begin 或 start transaction 开启事务。

4 事务的并发问题(脏读、不可重复读、幻读)

4.1 脏读

        脏读表示一个事务在处理过程中,读取到了其他事务未进行提交的数据。这种数据被称之为脏数据,依据脏数据进行的操作可能是不正确的。

时间顺序转账事务取款事务
1开始事务
2开始事务
3查询账户余额为2000元
4取款1000元,余额被更改为1000元
5查询账户余额为1000元(产生脏读)
6取款操作发生未知错误,事务回滚,余额变更为2000元
7转入2000元,余额被更改为3000元(脏读的1000+2000)
8提交事务
备注按照正确逻辑,此时账户余额应该为4000元

4.2 不可重复读

        不可重复读是指在一个事务范围内,多次进行相同的查询,却得到不同结果。也就是说多次读取同一条记录,但记录中的某些列的值被修改过。

时间顺序事务A事务B
1开始事务
2第一次查询,小明的年龄为20岁
3开始事务
4其他操作
5更改小明的年龄为30岁
6提交事务
7第二次查询,小明的年龄为30岁
备注按照正确逻辑,事务A前后两次读取到的数据应该一致

4.3 幻读

        幻读是指当事务不是独立执行时发生的一种现象,幻读主要是说多次读取一个范围内的记录,包括直接查询所有记录结果或聚合统计,发现了结果数量的不一致性 (包括结果的增多或减少)。

时间顺序事务A事务B
1开始事务
2第一次查询,数据总量为100条
3开始事务
4其他操作
5新增100条数据
6提交事务
7第二次查询,数据总量为200条
备注按照正确逻辑,事务A前后两次读取到的数据总量应该一致

5 事务隔离级别

看一下 SQL92 ANSI/ISO 定义的事务的四种隔离级别:

  • Read Uncommitted (读未提交):事务未提交的数据对其他事务也是可见的,会出现脏读
  • Read Committed (读已提交):一个事务开始后,只能看到已提交的事务所做的修改,会出现不可重复读
  • Repeatable Read (可重复读):在同一个事务中多次读取同样的数据结果是一致的,这种隔离级别未定义解决幻读的问题
  • Serializable (串行化):最高的隔离级别,通过强制事务的串行执行

那么这几个级别能解决什么问题呢:

  • 在读未提交级别,不能解决任何事务并发的问题
  • 在读已提交级别,能够解决脏读问题
  • 在可重复读级别,能够解决不可重复读问题
  • 在串行化级别,能够解决所有问题,但是相应的会降低数据库事务的并发度,降低性能

事务隔离级别脏读不可重复读幻读
读未提交
读已提交
可重复读
串行化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值