MySQL事务实际操作之深度理解 事务隔离级别

既然前面已经学了 MySQL的事务 ,这篇文章就来进行实际的操作

 

针对MySQL 8.0.15 

首先的首先:对于MySQL 中的MyISAM引擎是不支持事务的。所以一切事务操作要对应InnoDB引擎

新建一个user表进行测试  : 注意设置默认引擎为 InnoDB

create table user(
    id int auto_increment,
    username varchar(10),
    password varchar(10),
    primary key (id)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入一条数据

insert into user (username, password) value ('error311', '123456');

如果你使用你之前的表,需要查看当前表的引擎是否为  InnoDB

show create table user;

开始测试 : 为了区分,我设置了颜色,丑,但是清楚

紫色为 A 客户端            红色为 B 客户端                 两个客户端分别表示的两个事务(因为是并发嘛)

 一、隔离级别第一级别: 读未提交(read-uncommitted)

先查看 隔离级别 

SELECT @@transaction_isolation;

再设置隔离级别,注意,此处的session可以修改为  global(但是对于设置之前打开的窗口无效),所以还是最好查看当前窗口的隔离级别,两个单独设置

set session transaction isolation level read uncommitted;

   一、读未提交

 

1.客户端A开启事务并查询

2.客户端B开启事务并进行修改,并没有对事务进行提交

3.此时回到客户端A,发现客户端A可以查看客户端B并没有提交的数据

4.这就是脏读,如果此时事务B出现异常造成回滚,那么客户端A查到的数据毫无意义

 

二、读已提交

1.同样:两个客户端先设置隔离级别

set session transaction isolation level read committed;

2.客户端A开启事务,并查询数据

2.客户端B开启事务,并进行修改

3.此时回到A,查询发现数据并没有变。说明脏读的情况已经被解决

4.第一个事务的查询结果就会受到第二事务的影响,这个也就是产生不可重复读的问题。

 

三、可重复读

1.设置隔离级别为 可重复读

 

2.两个开启事务

3.客户端B更新后提交,查看A,发现A并没有变化。(也就是事务B的更新不再影响已经进行中的事务A)解决了不可重复读问题

 

 

 

 

 

四、串行化

同时开启事务,当事务B试图添加数据时,报错,由于A正在事务中,锁住整张表,无法添加

 

所以说隔离级别越高,越安全。但是带来的性能越来越差

对应的事务隔离级别,也就引来的MySQL数据库锁的机制

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值