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才能一个一个的执行。

相关推荐
wishfly2 分钟前
数据库重连 - 方案
数据库
梦仔生信进阶1 小时前
基于R计算皮尔逊相关系数
前端·数据库·r语言
阿乾之铭2 小时前
Mysql数据库索引
数据库·mysql
孤寒者4 小时前
MYSQL8创建新用户报错:You have an error in your SQL syntax;check...
数据库·sql·mysql·创建新用户操作
c_weith4 小时前
自动生成数据:SQLark 让数据测试更高效
数据库·性能测试·数据生成·sqlark
隔壁老登4 小时前
sql报错非法的字符校对Illegal mix of collations
数据库·sql
非凡的世界4 小时前
PostgreSQL 超级管理员详解
数据库·postgresql
非凡的世界4 小时前
linux命令行连接Postgresql常用命令
linux·数据库·postgresql
Dnelic-6 小时前
Kotlin | Android Provider 的实现案例
android·数据库·kotlin·provider·自学笔记