MySQL高级(事务隔离界别)

1.如何查, 设置mysql的隔离界别

什么是全局隔离级别?

话隔离界别就是session.tx_isolation。 也就是只影响这一次登录。 而全局隔离级别global.tx_isolation也影响后续的登录。

select @@global.transaction_isolation;--查看全局隔级别
select @@transaction_isolation; --查看会话(当前)全局隔级别
select @@transaction_isolation; --查看会话(当前)全局隔级别
select @@session.transaction_isolation; --查看会话隔离界别
set [session | global] transaction isolation level {read uncommitte | read committed | repeatable read | serializable}
  • 设置当前会话串行化

    set session transaction isolation level serializable;

  • 但是新起会话不收到影响
  • 再设置回来

    set session transaction isolation level read uncommitted;

  • 如果全局隔离级别和会话隔离级别不同, 就会默认使用会话隔离级别。

2.读未提交

  • 先启动两个事务
  • 然后右边查看一下表中的数据
  • 然后在左边插入数据
  • 之后再从右边查看, 就能看到数据已经查看到了。

我们左边还没提交呢, 右边就能看到。 这就叫什么, 这就叫做读未提交!一个事务在执行中,读到另一个事务的更新但是还没有commit的数据, 这种情况叫做脏读。------这是一种不合理的现象。

  • rollback回滚也能看到数据又恢复了

2.读提交

  • 先将事务的隔离级别改为读提交

    set session transaction isolation level read committed;

  • 两边启动事务
  • 先查看一下表中的数据
  • 然后我们插入数据
  • 但是我们左边查的话就能看到

  • 然后我们左边提交commit

  • 右边再查, 就会看到数据修改了

这种一旦提交就能看到的就叫做读提交。 读提交好像解决了脏读的问题。 但是又出现了另一个问题:就是我们左边在提交前和提交后, 我们右边select查到的数据结果是不一样的。 也就是说我们右边一直select, 结果某一次select的时候, 数据突然变了。 ------这种现象, 就叫做不可重复读。

3.可重复读

  • 先设置可重复读
  • 启动我们的事务

  • 然后查看我们的数据

  • 然后我们进行插入,之后右边查看, 会发现, 右边没有数据更新
  • 然后我们左边直接提交了, 右边也看不见
  • 然后重启事务, 就能看到了

对于可重复读, 有的数据库因为insert的插入有些特殊, insert不能可重复读。所以就形成了幻读现象, 也就是好像出现了幻觉一样。 mysql是解决了这个问题的。

4.串行化

  • 设置隔离级别

  • 然后启动事务, 先启动左边事务, 再启动右边事务

  • 然后左侧查找, 能将数据查出来

  • 然后右边我们也查, 也能查出来

  • 然后我们右边删除一下数据张三, 我们会发现, 右边的事务卡在这里了

  • 后我们左边的事务commit一下,右边的事务就启动了

  • 然后我们重启左边事务, 又在右边删除数据田七。 会发现右边不阻塞了

上面这种现象就是串行化的现象, 一开始左边事务先启动, 默认他先执行。 然后右边事务即便修改, 也会阻塞在那里。 然后我们左边事务提交了,再启动。它的顺序相当于在右边事务的后面了。 右边事务就不会被阻塞了。
所以我们发现一个问题, 就是如果我们的客户端里面是查的话, 就直接执行了。但是如果是增删改操作, 就会判断是不是该这个客户端执行,如果不是,就将sql放到等待队列里。前面的事务结束了, 这些sql才能一个一个的执行。

5.总结

所以我们发现一个问题, 就是如果我们的客户端里面是查的话, 就直接执行了。但是如果是增删改操作, 就会判断是不是该这个客户端执行,如果不是,就将sql放到等待队列里。前面的事务结束了, 这些sql才能一个一个的执行。

相关推荐
李长渊哦1 小时前
使用Druid连接池优化Spring Boot应用中的数据库连接
数据库·spring boot·后端
斗-匕2 小时前
Spring Boot自动装配:约定大于配置的魔法解密
数据库
铁头乔3 小时前
IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up
数据库·开源·时序数据库·iotdb
一 乐3 小时前
高校体育场管理系统系统|体育场管理系统小程序设计与实现(源码+数据库+文档)
前端·javascript·数据库·spring boot·高校体育馆系统
来一杯龙舌兰4 小时前
【Postgresql】Windows 部署 Postgresql 数据库 (图文教程)
数据库·windows·postgresql
blog_wanghao4 小时前
C#: 创建Excel文件并在Excel中写入数据库中的数据
数据库·c#·excel
xianwu5435 小时前
反向代理模块kd
开发语言·网络·数据库·c++·mysql
vdigital5 小时前
本地主机(localhost)11434端口 HTTP 连接10061原因及解决
java·服务器·数据库
蓝牙先生5 小时前
git自动化之.netrc配置
数据库
漫步者TZ6 小时前
【kafka系列】At Least Once语义
大数据·数据库·分布式·kafka