【MySQL】事务的四大特性(ACID)与事务四大隔离级别

一、事务

1.事务(transaction)
事务是指一个完整的业务逻辑,一个不可再分的工作单元。
2.一个完整的业务逻辑
假设转账,需要从A账户向B账户中转账1000,将A账户的钱减去1000(update语句),将B账户的钱加上1000 (update语句),这就是一个完整的业务逻辑。
以上的操作就是一个最小的工作单元,要么全部成功,要么全部失败,不可再分。
这两个update语句要求必须全部成功或者全部失败,这样才能保证转账是成功的。
3.只有多条DML操作才会涉及事务
update、delete、insert会涉及数据库中数据的增、删、改,凡是涉及对数据库表中数据的操作就需要涉及安全问题,需要考虑事务机制。事务就是多条DML语句要么全部成功,要么全部失败。
4.事务如何实现
在MySQL默认存储引擎InnoDB中,提供了一组用于记录事务性活动的日志文件。在事务执行的过程中,每一条DML操作都会记录在该日志文件中。
当执行提交(commit)操作后,将会清空这次事务操作涉及的日志文件,将结果持久化到数据库表中;
当执行回滚(rollback)操作后,将会清空这次事务操作涉及的日志文件,将上次commit之后的事务操作全部撤销。
(注意:提交之后再回滚没有任何意义,因为日志文件已经被清空,此次的操作已经生效;反之也是如此
5.提交、回滚事务
提交commit;
回滚rollback;
MySQL默认自动提交事务,每次执行完DML操作后就会自动提交。
(提交和回滚只能到上次提交的位置)
如下,在MySQL自动提交以后,回滚已经没有作用。
在这里插入图片描述
(1)手动开启事务,实现事务的回滚操作:
手动开启事务start transaction;
手动开启事务,MySQL内部没有自动提交(commit),回滚(rollback)操作可以生效。
在这里插入图片描述
(2)手动开启事务,实现事务的提交操作:
手动开启事务start transaction;
手动开启事务,执行完commit操作后,数据已经持久化到数据库表中,rollback已经没有意义。
在这里插入图片描述

二、事务四大特性

事务ACID理解

事务是恢复和并发的基本单位。
事务包含4个特性:ACID
1.原子性(Atomicity)
事务是数据库的逻辑工作单元,事务中包括的的操作要么都做,要么都不做。
2.一致性(Consistency)
事务执行的结果必须使数据库从一个一致性状态转到另一个一致性状态。
3.隔离性(Isolation)
一个事务的执行不能被其他事务所干扰。即一个事务的内部操作使用以及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4.持久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就是永久性的。接下来的其他故障或操作不应该对其执行结果产生影响。

影响事务ACID特性的因素

(1)多个事务并发运行时,不同事务的操作交叉运行;
(2)事务在运行过程中被强行终止。

三、事务的四大隔离级别

MySQL具有四种隔离级别,分别是Read Uncommitted(读未提交)、Read Committed(读已提交)、Repeatable Read(可重复读)、Serializable(串行化)。四种隔离级别依次增强
查看事务的隔离级别select @@global.transaction_isolation;
在这里插入图片描述
设置事务的隔离级别set global transaction isolation level read uncommitted;
在这里插入图片描述
1.Read Uncommitted(读未提交):当前事务已经读到其他事务未提交(commit)的数据,但数据被回滚(rollback),称为脏读。
2.Read Committed(读已提交):当前事务读取到其他事物已经提交(commit)的数据,读取到的是最新的数据。
(解决了读未提交问题,但是会出现在同一事务中 select 读取到的数据前后不一致,会出现不可重复读问题。)
3.Repeatable Read(可重复读)(MySQL默认事物隔离级别)在同一事务中多次读取同样的数据结果是一致的。
(解决了不可重复读的问题,但是会出现幻读的问题,即当用户读取某一范围的数据时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,读到的只有数据和之前一致,无法读到其他事务操作后的数据。)
4.Serializable(串行化):最高的事物隔离级别,串行化强制事物排序阻塞,避免事物冲突。
(解决了上述所有的问题,它使用了共享锁,事务无法并发,执行效率。)

验证事务的隔离级别

严格注重执行次序,才能观察到结果。此处测试使用的是t_user表。

create table t_user(nane varchar(25));

在这里插入图片描述
1.Read Uncommitted(读未提交)
在这里插入图片描述
2.Read Committed(读已提交)
在这里插入图片描述
3.Repeatable Read(可重复读)
在这里插入图片描述
4.Serializable(串行化)
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智商三岁半i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值