张哥是某传统通讯公司的程序员,去年由于疫情的影响公司效益不好,收入降了一大截,房贷、车贷和孩子的奶粉钱压得他喘不过气来,这不到了金三银四的季节,张哥萌生了想要跳槽的想法,投了很多的企业,收到的面试机会也不少,但是每次聊完技术,面试官都是很客气的告诉张哥:今天的面试就到这里,结果HR会通知你的。
张哥很是苦恼,与我聊天的时候:说自己这些年光CRUD了,根本没有学习过其他的知识。他还告诉我一个消息:最近的面试,面试官死抓着数据库不放。这不昨天,面试官让张哥举例说下数据库的事务隔离级别的作用,他没答上来,所以又凉了。
正好自己最近也在备战,分享一下自己对数据库事务隔离级别的理解
什么是事务数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
通俗点来讲:就是我们执行的一系列SQL语句,如果在同一个事物中,要么全部执行成功,要么全部执行失败,不会存在部分执行成功,部分执行失败。并且数据保存到磁盘上之后,就不会再丢失了
数据库事务的特性数据库的事务
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
四大事务隔离级别
在讲事务隔离级别前:我想先讲一下事务并发带来的问题
- 脏读 数据库有两个事务A、B,脏读是指事物A读取到事物B未提交事物的数据,当事物B回滚后,事物A拿到的数据就是脏数据。
- 不可重复读 数据库有两个事务A、B,不可重复读是指事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致
- 幻读 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
事务隔离级别 |
脏读 |
不可重复读 |
幻读 |
读取-未提交(read-uncommitted) |
是 |
是 |
是 |
读取-已提交(read-committed) |
否 |
是 |
是 |
可重复读(repeatable-read) |
否 |
否 |
是 |
串行化(serializable) |
否 |
否 |
否 |
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
示例带你了解隔离级别的作用开启事务的语句:start transaction;
首先我们先打开两个MySQL的客户端并查看其事务隔离级别,如下图:
默认的事物隔离级别
1、验证脏读
先设置两个事物的隔离级别为 read-uncommitted;
set session transaction isolation level read uncommitted;
设置读未提交事物隔离级别
事物A:将数据修改为1000
事务A修改值
事物B:将数据改为800,但是事务B没有提交
事务B修改数据
此时事务A读取到了事务B修改后的值
事务A读取最新的数据
此时如果事务B回滚了,事务A读取到的就是脏数据。
2、验证不可重复读
先设置事务隔离级别为read committed;
set session transaction isolation level read committed;
事务B:第一次修改数据,未提交事务
事务A:第一次读取数据,未读取到事务B修改的数据,解决了脏读问题
事务B:提交事务
事务A:第二次读取数据,读取到了事务B提交数据
事务B:重新开启事务,第二次修改数据,并提交数据
事务A:再次读取数据,发现同一个事物内,两次读取的数据是不一样的,这就是不可重复读
3、验证幻读
开启两个事物,将事物的隔离级别设置为:repeatable-read(mysql默认的隔离级别)
事物A:第一次读取的数据
事物B:第一次修改数据
事物A:第二次读取数据
事物B:第二次修改数据
事物A:第三次读取数据,
因此我们可以看到解决了不可重复度的问题
总结数据库的事务隔离级别分为四种,不同的隔离级别可以解决不同的事务并发问题,同时更高的隔离级别会损失更多的性能,因此我们在实际使用的时候,要根据自身的业务场景来选择合适的隔离级别。
[机智]希望大家新的一年都能涨薪,实现人生理想。[机智]
,