博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】今天是2020-05-31,周日啊,第一次在周末的时候写文章,因为感觉自己需要恶补一下知识,所以利用这个周末来学习学习,这篇文章主要介绍一下 MySQL 的四种事务隔离级别,并分别对每种隔离级别给出相应的小示例。
首先说一下事务的特点,然后再开启今天的主要内容,事务一共有四个特性(ACID),即:
原子性(Atomicity):事务中的所有操作,要么都执行成功,要么都执行失败。
一致性(Consistency):事务的开启之前和提交之后,能够保证数据的一致性。(比如用户A给用户B转100块,则A的余额减少100,B的余额增加100,如果出现B的余额不增加,那么就出现了数据的不一致性。)
隔离性(Isolation):一个事务的执行不会受到另一个事务的干扰。事务隔离级别就是在这一特性中。
持久性(Durability):一旦事务已提交,对数据的修改是永久的,不可再次被回滚。
在 MySQL 存储引擎为 Innodb 时,是支持事务处理的,而一共有四种隔离级别分别是:
read uncommitted (读取未提交)
read committed (读取已提交)
repeatable read (可重复读)
serializable (可串行话)
以上四种隔离级别依次从上到下隔离级别升高,其中默认的隔离级别是:repeatable read(可重复读)。
用到的基础数据准备:
create table book (id int auto_increment primary key,name varchar(100),count int);
insert into book values(1,'《高性能mysql第三版》',100),(2,'MySQL技 术内幕(第4版)',100);
create table good(id int auto_increment primary key,name varchar(100),price decimal(10,2));
insert good values(1,'华为mate 30',2000.00);
本隔离级别是最低的,在实际应用中很少使用,因为在这个隔离级别中,可以查询到其它未提交事务的执行结果,会造成脏读(Dirty Read),接下来我们就演示一下脏读的出现。
select @@tx_isolation; -- 查看当前会话的隔离级别
set session transaction isolation level read uncommitted; -- 设置当前隔离级别为 read uncommitted
begin; -- 显示的开启事务(也可以用 start transaction; 或者 set autocommit = 0;)
开始两个事务,其中一个事务1的隔离级别是 read uncommitted,事务2的隔离级别无关紧要,因为事务1是最低级别的,所以在其它任意的隔离级别都会造成脏读问题。请看如下截图所示:
在这个隔离级别中,可以解决脏读的问题,但是会造成不可重复读问题,请看截图:
这一级别是 MySQL 默认的级别,也是在实际应用中几乎所有开发中使用的级别。这里就可以解决脏读、不可重复读的问题,但是不能解决幻读,也不能完全解决并发问题。
幻读就是针对其它事务种有 insert 操作时,并已提交的情况。
serializable 可串行化是最高级别的,读写数据都会锁住整张表,它可以完美解决 MySQL 并发的所有问题,但是效率极低,所以一般也很少使用。
它可以解决脏读、不可能重复读、幻读等问题,在这里主要演示一下它解决幻读的问题。
set session transaction isolation level serializable;
最后总结一下:事务的隔离级别越高,就越能够保证数据的完整性和一致性,但是对性能的影响也越大。
版权归 马富天个人博客 所有
本文标题:《MySQL 事务的四种隔离级别简介》
本文链接地址:http://www.mafutian.com/445.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |