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