首页 > 数据库 >mysql隔离级别

mysql隔离级别

时间:2023-03-01 15:58:33浏览次数:43  
标签:事务 窗口 隔离 查询 提交 mysql 级别

最近在公司项目上遇到一个问题,客户使用某个功能经常出现重复数据,后面经排查,发下这个功能因为设计到递归,而且是一个粒度比较大的事务,

操作比较耗时,mysql数据库使用了默认的隔离级别RR,因此上一个用户操作后事务没有完成,下一个用户又重复操作了,数据被重复写入了.

解决方案是后来在事务执行之前加了一个表,用来记录操作数据id,保存前进行判断是否有记录,有则直接返回,没有则保存记录执行事务后删除记录.

现在我们来重现一下这种场景

首先新建一张表

 

 

 新建三个窗口连接数据库测试

 

 

 1.读未提交RC

两个窗口连接上数据库,开启事务,查询t_user表

 

 

 

 

 

 窗口2更新t_user表

 

 

 此时窗口3再执行查询语句,发现读到了事务没有提交的脏数据,这种情况称之为"脏读"

 

 

 把窗口二和三的mysql退出(一定要退出,否则修改隔离级别在当前会话不生效)

2.读已提交

窗口一修改隔离级别

 

 

 窗口二/三连接数据库开启事务查询

 

 

 

 

 

 窗口二更新表数据

 

 

 窗口三执行查询,发现数据没有变化

 

 

 窗口二提交事务,窗口三执行查询;

 

 

 

 

 

 这时候,我们会发现窗口三读到了窗口二提交的数据,顾名思义这种场景的隔离级别就是读已提交,在这个隔离级别下,在同一个事务中执行了两次相同查询语句的到了不一样的结果,这种现象叫"不可重复读"

3.可重复读RR

这种隔离级别解决了读已提交出现的"不可重复读"的问题,所以称之为可重复读.是mysql的默认隔离级别;

 

 

 开启事务 查询

 

 

 

 

 

 

窗口二更新

 

 

 窗口三读不到更新记录

 

 

 窗口二提交事务,窗口三查询,依旧查询不到数据

 

 

 

 

 在这个隔离级别下会出现幻读的场景

窗口二/三开启事务,窗口二插入一条数据并提交

 

 窗口三查询数据,查不到窗口二提交的数据,但是当窗口三执行update语句时会发现有update了两条数据

 再次查询,查到了数据

 

标签:事务,窗口,隔离,查询,提交,mysql,级别
From: https://www.cnblogs.com/jiaqirumeng/p/17168495.html

相关文章

  • MySQL数据库架构&SQL注入漏洞
    查找zblog数据库中有哪些表SELECTTABLE_SCHEMA,TABLE_NAMEFROMinformation_schema.`TABLES`WHERETABLE_SCHEMA='zblog';查找目标表(zbp_category)中的字段SELECT6,COLU......
  • 国产计算机开发实践之环境搭建(Java+Mysql+Idea)
    操作系统:统信UOS/麒麟架构:aarch64(命令行uname-m查看)一、Java1.解压安装包(注:在安装包所在路径下输入命令)sudotar-zxvfjdk-8u271-linux-aarch64.tar.gz-C/usr/loca......
  • yum卸载mysql
    查找mysql安装的文件:rpm-qa|grep-imysql卸载查找出的文件:yumremove"文件名"查看是否卸载完成:rpm-qa|grep-imysql查找mysql相......
  • MySQL 查询常用操作(0) —— 查询语句的执行顺序
    MySQL中明确查询语句的执行顺序极其重要,了解执行顺序才不至于犯一些简单错误,例如having后面是否可以使用select中重命名的列名等问题。另外SQL中实际使用最频繁的就是查......
  • 利用python操作数据库MySQL
    一、python操作MySQL的库(包)1.PythonDatabasAPI   Python操作数据库的标准接口为PythonDatabasAPISpecificationV2.0,其定义了在python中操作数据库的方法......
  • 利用python将MySQL数据导出到excel中
    涉及到的相关库:   pymysql、   xlwt库函数(将MySQL一个数据表导出到excel文件的一个表)文件exportexcel.py内容:defexport_to_excel(worksheet,cursor......
  • mysql中使用 when then 格式化查询结果
    mysql>select*fromuser;+----+------+------+|id|name|sex|+----+------+------+|1|张三|1||2|李四|1||3|张珊|0|+----......
  • Mysql获取时间戳的一些处理
    前情提要:老板需要一个统计今日新增用户的功能我的想法是统计24小时内新增用户的功能直接去问AI我明确指出了时间戳但是AI给出的答案却差了口气这就是老板给我工资......
  • Mysql常见的数据表类型
    明细表明细表/详情表比较常用。一般会有一张带有id的主表,比如tt_order,主键为id,字段比较少。明细表/详情表tt_order_detail,存放了大量的明细字段,有一个字段order_i......
  • MySQL的RR和RC事务隔离级别加锁类型验证
    先上结轮:MySQL5.7数据库Innodb引擎在默认的REPEATABLE-READ(RR)事务隔离级别时,事务更新操作对于where条件锁定的范围加的是Next-KeyLock即临键间隙锁,对于确切条件......