Mysql中事务是什么?有什么用?( 四 )

注意:

  • MySQL默认事务隔离级别为可重复读(RR),oracle默认事务隔离级别为读已提交(RC) 。
  • MySQL存在幻读,而oracle存在不可重复读和幻读的情况!
  • 数据库的事务隔离越严格,并发副作用越小,但付出的代价越大;
命令:show variables like 't%_isolation';select @@session.transaction_isolation;select @@global.transaction_isolation;注意:早期版本的mysql中用的变量名称是tx_isolation,5.7.20版本之后,用的是transaction_isolation 。
事务隔离级别分为会话和全局,会话在上面有提到过,一个客户端可以有多个会话 。会话一旦关闭,设置的就失效了 。可以通过以下命令针对两种进行修改, SESSION就是会话级别的 , GLOBAL全局的
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }如下示例,修改会话事务隔离级别为 READ UNCOMMITTED:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;(1)首先演示第一种:读未提交(Read Uncommitted)首先读未提交会出现脏读,那么我们就进行通过读未提交来演示脏读!
我们就还是以这两条数据进行演示,其次我们要进行演示并发场景,就需要两个客户端,那么我们直接通过cmd打开两个窗口 来进行连接mysql演示并发场景 。
打开cmd通过命令进行连接: mysql -hlocalhost -u账号 -p密码
Mysql中事务是什么?有什么用?

文章插图
 
我的客户端查出来的数据是乱码的,应该是数据库编码有问题,但是这不影响我们演示
以下示例就是典型的脏读,也就是读取到了他没有提交的数据,没有提交就意味着数据并没有存到磁盘,他很有可能会进行回滚,一旦回滚,而别的客户端读到了他没提交的数据,而且还依赖这些脏数据做了别的操作,那将后果不堪设想!
Mysql中事务是什么?有什么用?

文章插图
 
(2)第二种:读已提交(Read Committed)读已提交可以避免脏读,这我们就不再测试了,想测试的可以按照上面的测试方法进行测试,看看是否会有以上问题!
读已提交存在不可重复读和幻读的问题,同时也是oracle默认的隔离级别,我们重点演示不可重复读!
Mysql中事务是什么?有什么用?

文章插图
 
其实仔细想想不可重复读其实并不是很严重,他无非是在一个事务当中多次读取可能值不一样,但是他读出来的都是提交过后的,也就意味着永远是最新的数据,有时候未必是一件坏事!!!
(3)第三种:可重复读(Repeatable Read)可重复读可以避免脏读和不可重复读情况,但是没办法避免幻读,所以本次重点演示幻读!
在测试这个的时候我们需要将id自增给关掉,自增的情况下不会出现这种情况!
新增的时候发现报错,原因就是id为主键唯一,但是不是新增,在新增的时候实际上数据库已经存在了id为3的数据,导致新增失败,而他在这个事务当中不管怎么去查,也查不到id为3的数据,这就是幻觉!!!
Mysql中事务是什么?有什么用?

文章插图
 
说白了不可重复读就是在当前事务当中,不管别的客户端操作没操作过数据,他查到的都是他开启事务之前的数据 。所以他根本不可能存在脏读,也不可能存在不可重复读 。
(4)第四种:串行化(Serilizable)读的时候加共享锁,也就是其他事务可以并发读,但是不能写 。写的时候加排它锁,其他事务不能并发写也不能并发读 。
Mysql中事务是什么?有什么用?

文章插图


推荐阅读