首页 > 数据库 >设置MySql事务隔离级别的坑

设置MySql事务隔离级别的坑

时间:2022-12-15 10:44:37浏览次数:60  
标签:事务 读取 级别 MVCC MySql 数据 隔离

结论

设置MySql会话级别事务隔离级别时需要先设置当前会话的事务隔离级别,然后再开启事务,否则新开启的事务隔离级别不是新设置的,而是之前的。

验证过程

1. 查看当前会话的隔离级别

2. 开启事务

3. 设置RC事务隔离级别

4. 其中一个事务更新数据,观察另外一个事务是否可以读取到最新数据

5. 不能读取到,证实还是之前RR隔离级别

6. 再次重新开启事务

7. 其中一个事务更新数据,观察另外一个事务是否可以读取到最新数据

8. 能读取到,证实是RC隔离级别

RC和RR隔离级别实现原理

MySQL 中的提交读和可重复读两个隔离级别是使用多版本并发控制 MVCC 来实现的,而不是通过添加读写锁来实现的,如果通过读写锁来实现隔离级别的话,只有读读可以并发,读写,写读,写写都不能并发,这样数据库的并发度太低了,所以一般不通过加读写锁来实现隔离级别。而如果使用 MVCC 来实现 提交读和可重复读两个隔离级别的话则可以在读的时候不加锁,读写和写读可以同时进行,只有写写需要阻塞,这样就极大地提高了并发度。

MVCC 机制会记录每行数据的历史版本,通过可见性算法、undo 日志以及 read view 控制每个读操作所读取的行数据历史版本,

Repeatable Read 在事务发生第一次读的时候选定所要读取的数据行的版本,整个事务都读取这一个版本的数据行,所以可以重复读,每次读取的数据都一致。

Read Committed 在事务中每次读操作都是读取最新的行数据版本,而这最新的数据行版本很可能是某个事务进行了修改操作后提交的,所以可能会发生多次读取同一行数据,但是前后读取的数据不一致的情况。这就是不可重复读现象,所以提交读不能避免不可重复度现象。

想要详细了解MVCC是如何实现事务隔离的,可以阅读这篇博客, MySQL中MVCC的正确打开方式(源码佐证),写的非常好,强力推荐。

标签:事务,读取,级别,MVCC,MySql,数据,隔离
From: https://www.cnblogs.com/bigstrong/p/16984456.html

相关文章

  • MySQL的字符集配置
      utf8的锅:场景 :之前在给客户做微商城时,需要保存微信的授权信息,此时就有一个nickname字段,在设计数据表时,潜意识的将表的存储格式设置为utf8,生产上线一段时间后偶尔出现......
  • mysql参数配置文件
    (1)参数配置文件中的内容以键值对形式存在。(2)如何查看键值对?showvariableslike'%name%';或者查看information_schema库下的global_variables视图; 如何修改呢?  1、innod......
  • golang.mysql
    一、mysql操作基本语法1、创建名称nulige的数据库 ​​CREATEDATABASEnuligeDEFAULTCHARSETutf8COLLATEutf8_general_ci;<br><br>usenulige​​2、建表,Id自增​​c......
  • MySQL锁
       分类 MySQL中的锁,按照锁的粒度分,分为以下三类: 全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。全局锁全局......
  • MySQL
    MySQL临时表MySQL临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。临时表在MySQL3.23版本中添......
  • mysql命令行操作
    1、展示数据库2、进入数据库、查看数据库中的表......
  • Docker 中应用(tomcat 、nginx、mysql、redis)部署
    1.tomcat在docker安装2.nginx在docker安装3.mysql在docker安装4.redis在docker中文件安装......
  • EMQx 通过mysql实现 acl
    Acl访问控制说明:按照道理来说 mysql实现acl和mysql的鉴权,要在一块的说明的,但是在由于在理解鉴权的时候对acl的理解不是那么深刻,所以只能分开来验证和说明了。虽然EMQ已......
  • gateway动态路由实现 mysql+redis 实现
    前言大家都知道咱们在通常是使用配置文件来实现配置,但是这样就有一个弊端,就是每次修改的时候都要去重启来实现,并且管理起来非常麻烦,所有就有了这种实现方式。现在的实现方式......
  • spring boot 实现Mysql数据脚本导出和数据库脚本的导入
    前言在开发过程中这样一个需求,有些数据需要从数据库导出,然后导入到另外的数据库中。数据导出@SneakyThrowspublicStringexport(){//获取数据库连接对象......