mysql事物隔离级别分为四种, (文档)

READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE

接下来会通过实践,来逐步介绍四种隔离级别的作用。mysql默认的隔离级别为repeatable-read。可通过select @@tx_isolation查看。如下图所示:

tx_isolation是mysql system variables, 其余system varaiables可通过官方文档查看。

READ-UNCOMMITTED

该事物隔离级别可读取其它事物未提交的结果

通过mysql -u username -p password 开启两个mysql连接, 分别为A连接, B连接。输入set tx_isolation = 'read-uncommitted';将A连接的事务隔离级别设置为READ-UNCOMMITTED 在A,B连接的窗口分别查询test1表的数据, 表数据一致, 如下图所示

在B连接的命令窗口输入start transaction;,并更新相应记录, 但不提交,如下图所示

在A连接的命令窗口查看test1表, 结果如下图所示

通过结果发现。B连接,开启事物,修改数据,并未提交,A连接在read-uncommitted的隔离模式下仍然可以看到已更新的数据。 B连接窗口输入rollback回滚数据,此时A,B连接所查询的数据,和初始时的数据是一样的。

READ-COMMITTED

该事物隔离级别只会读取已提交的数据,在事务中已更改但未读取的数据不会读取

同上A,B 两个连接输入set tx_isolation = 'read-committed';将A连接的事务隔离级别修改 B连接窗口开启事务,更新数据,但不提交,如下图所示

在B连接窗口查看数据已变更在A连接窗口查看test1表格,如图

从结果可以看出A连接并未读取到B连接事务内未提交的更新数据在B连接窗口提交事务,再到A连接窗口查看, 如图

A连接可以读取到B连接已提交的数据

REPEATABLE-READ

该事务隔离级别只会读取已提交的结果,与READ-COMMITTED不同的是,repeatable-read在开启事务的情况下,同一条件的查询返回的结果永远是一致的,无论其它事物是否提交了新的数据

和READ-COMMITTED的实验环境差不多,此时将A的隔离级别改为 repeatable-read,B还是一样开启事物,更新数据, 此事暂时不提交。但A开启事物查询数据。如图

B连接

A连接

如结果所示,B未提交的数据,A读取不到

此时B提交事物, A继续查询,会发现A仍然读取不到B已提交的结果,这就是所谓的可重复读,如下图所示

B连接

A连接

此事A提交事物,在查看会查询到B更改的结果,如图

SERIALIZABLE

这种隔离级别和repeatable-read类似,只会读取其它事物已提交的内容,有一点不同的地方在于,如果autocommit为false,那么每一条select语句会自动被转化为select ... lock in share mode.这样出现一些阻塞情况

English Explanation

This level is like REPEATABLE READ, but InnoDB implicitly converts all plain SELECT statements to SELECT ... LOCK IN SHARE MODE if autocommit is disabled. If autocommit is enabled, the SELECT is its own transaction. It therefore is known to be read only and can be serialized if performed as a consistent (nonlocking) read and need not block for other transactions. (To force a plain SELECT to block if other transactions have modified the selected rows, disable autocommit.)

B开启事务, 并更新数据,但不提交

A 隔离级别改为serializable, 并且开启事务或者将autocommit设置为0, 并查询被修改数据,如图

B

A(已经将autocommit设置为0)

结果表明A连接被阻塞住了, 同样的,如果A开启事务先查询, 未提交, B再去更新一样会被锁住。并且如果细心观察会发现,会发现很奇怪,按理来说lock in share mode应该是行锁定, 但是在我的机器上却成了表锁定,B只更新了id为4的记录,A查询ID为2的记录却仍然被锁定, 经过我测试在服务器上lock in share mode 确实是行锁定。经过多次测试发现如果查询数据中通过索引查询那么lock in share mode会根据索引锁行,如果查询条件中没有索引那么就直接锁表。

tips:serializable模式下, 如果设置了autocommit=0那么,会默认将select语句转为lock in share mode格式。

mysql isolation_mysqltx_isolation相关推荐

  1. mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

    先贴一张图! 第一步,"很重要" 在mysql中,有一个创建之初自带的库information_schema,这个库中包含着数据库相关信息,查询数据占用空间就是使用该库,所以首先进 ...

  2. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  3. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。

    下面有两条sql,主键查询,在mysql中查询到的结果相同. SELECT* FROM USER WHEREid = 'EM58hdK4nXC';SELECT* FROM USER WHEREid = ...

  4. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  5. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  6. docker一步安装mysql,docker的魅力就在于此

    正常来说,使用docker安装东西的步骤是serach它有没有,然后pull它 这里其实只要一步(如果你没有安装过.没有端口占用等问题的话!!) $ docker run -d -p 3306:330 ...

  7. 设置腾讯云linux服务器中 MySQL 允许远程访问

    申请了一台linux腾讯云服务器,想要把数据库搭建在上面,本地的Windows直接可以访问 以下就是具体的操作流程,首先你需要安装好一个mysql,安装方法–>mysql安装(Linux) 接着 ...

  8. Linux安装mysql,一步到位!

    今天在腾讯云上面买了一个服务器,想要把自己的项目部署一下,就要安装mysql,以下是我的安装步骤,在网上有很多人把install敲错了,还有的少-get,种种错误试完之后,我决定发一篇 sudo ap ...

  9. Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

    Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...

最新文章

  1. JavaScript 把字符串类型转换成日期类型
  2. android adb shell 命令大全
  3. 网站截图工具EyeWitness
  4. (转载)Shutter 0.90 发布 – BUG修复和增强
  5. java 打包边下载_JAVA实现边下载边压缩
  6. Linux操作系统的密码破解大全
  7. CAN接口芯片MCP2515的波特率和滤波器设置问题
  8. wap尝试调取app(网易新闻为例)
  9. 数据分析 - 用户中台(学习笔记)
  10. 正弦函数的频谱图matlab,怎样用MATLAB画正弦函数以及怎样看频谱图?
  11. 微信小程序原生的下拉框组件
  12. OpenCV3之——图像修补inpaint()函数
  13. 2022年汽车驾驶员(技师)考题模拟考试平台操作
  14. 基于PT8.2网关的二氧化碳监测及联动控制
  15. 深入React v16新特性(二)
  16. Linux搭建集群、负载。
  17. Visual Studio 2008 安装出错 无法安装 的解决办法
  18. springboot tomcat优化
  19. java如何调用驱动程序_使用Java驱动程序查找和上载
  20. dataframe两个表合并_Spark DataFrame 不是真正的 DataFrame

热门文章

  1. 学习dajango+sqlite3入门学习
  2. python生成日志文件_Python 日志生成器
  3. mysql 备份表_Mysql 表的备份与恢复
  4. itext生成pdf间距_使用itext生成pdf
  5. c语言学习-自定义并调用函数求三个数的最小公倍数
  6. Timeline的Animation Track详解
  7. oracle 后台进程管理,Oracle background processes后台进程
  8. 6远程桌面连接不上_windows server2008 远程桌面 创建新用户和多用户登录
  9. OpenShift 4 之通过Dockerfile部署容器应用
  10. Vue 3 首个 RC 版本发布