MySQL 事务——读提交,读未提交,可重复读,串行化,不可重复读、幻读、不可重复读

事务

概念

一系列操作的集合;
原子性:这个事务要么成功,要么不成功;不成功则回到执行事务的初始状态
隔离性:事务之间互不干扰,事务在提交之前相互是不可见的
一致性:数据库执行前后,数据都处于一致的状态
持久性:执行完成后,数据就会保存在数据库中

前置命令

  1. 事务被异常终止,数据会自动回滚
    ctrl / 强制数据库发生异常退出
  2. systemctl restart mysqld 重启mysql服务
  3. 使用select @@transaction_isolation; 进行查询隔离级别
    set global transaction isolation level READ UNCOMMITTED; 设置隔离级别
  4. show variables like 'autocommit'; 查看提交方式
    set autocommit=0; 更改提交方式
    ON——自动提交
    OFF——手动提交
  5. begin 开启事务
    end 结束事务并持久化
    接下来使用两个窗口演示,约定窗口:左a右b

读未提交——系统默认

两个事务同时启动,a事务读到b事务未提交的部分
设置事务隔离级别 set global transaction isolation level READ UNCOMMITTED;并重启

两个事务同时开始,插入数据之后,a可以读到未提交的内容
在这里插入图片描述

读提交

两个事务同时执行,a事务不能在b事务提交之前看到b事务对表的修改
设置事务隔离级别 set global transaction isolation level read committed;并重启

  1. 两边都开启事务,a端commit之前,b端无法看到更新的数据
    在这里插入图片描述
  2. a端commit之后,b端仍然处于事务中,但是可以看到a端提交的数据
    在这里插入图片描述

可重复读

在一个事务中进行增删改时,另一个事务不会收到影响(在执行第一句命令的时候,就生成一张view视图,读取的一直是这个视图的内容)
设置事务隔离级别 set global transaction isolation level repeatable read;并重启

  1. a,b开启事务,a插入数据,b查不到
    在这里插入图片描述
  2. a进行commit,b依旧查不到;b只有commit之后才能查到数据的变化
    在这里插入图片描述

串行化

事务之间对表的修改有先后顺序
设置事务隔离级别 set global transaction isolation level serializable;并重启

哪个事务先开始第一句,这个事务就已经持有锁——谁先启动事务无所谓,关键在于谁先对表动手,谁先动手谁就有锁
等待队列的单位是事务,只有一个事务提交,才能执行下一个事务

在这里插入图片描述

b先动手;a需要等待b提交完毕才能执行update;当a执行完update之后,b不能立即看见变换,因为a的事务还没有结束,a提交完事务之后,b才能看到变化

脏读、幻读、不可重复读

脏读:在一个事务中看到另一个事务未提交的数据
幻读:在一个事务中看到另一个事务已经提交的数据(原本存在的数据现在不存在)——另一个事务的insert/update/delete对本事务产生的影响
不可重复读:在一个事务执行相同的查询语句,看到不同的内容——本事务的select查到不同的内容
在这里插入图片描述

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值