欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql 详解隔离级别操作过程(cmd)

程序员文章站 2023-11-27 09:17:04
读未提交示例操作过程-read uncommitted 1、打开两个mysql的命令提示行,均进入相同数据库,并检查当前表内容为相同数据如下: 2、在a、b两端执行...

读未提交示例操作过程-read uncommitted

1、打开两个mysql的命令提示行,均进入相同数据库,并检查当前表内容为相同数据如下:

mysql 详解隔离级别操作过程(cmd)

2、在a、b两端执行select @@tx_isolation;检查当前默认的隔离级别别,可以发现都是

repeatable read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。)

mysql 详解隔离级别操作过程(cmd)

3、修改a端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有提交的数据。

set transactionisolation level read uncommitted;

在绿色的mysql5.5上请执行:

set sessiontransaction isolation level read uncommitted;

   然后再查看是否已经发生改变:

mysql 详解隔离级别操作过程(cmd)

4、在a、b两端都开启事务

starttransaction;

5、在b端修改一行数据如:

update stud setname='jhon' where id=1;

   其后在a端执行查询:select * from stud;

mysql 详解隔离级别操作过程(cmd)

6、此时b端再次执行回滚操作

rollback;

   再在a端进行查询,结果发现数据又回到了之前的数据。这就是脏读

mysql 详解隔离级别操作过程(cmd)

7、对于b端写入的新数据,如果没有提交a端也一样能查询到,这叫幻读

mysql 详解隔离级别操作过程(cmd)

 读已提交操作过程:-read committed

1、 检查a、b两端是否一致:

mysql 详解隔离级别操作过程(cmd)

2、修改a端(左)的隔离级别为readcommitted;

set transactionisolation level read committed;

   在a端开启事务:

   starttransaction;

   在b端开启事务

mysql 详解隔离级别操作过程(cmd)

3、在a端进行查询:

select * fromstud;

在b端修改一行记录并提交

update stud setname='itcast' where id=1;

再回到a端进行查询,发现在同一个事务内,两次查询的结果不一样:

mysql 详解隔离级别操作过程(cmd)

 可重复读示例repeatable read

1、查看a端的隔离级别是否为repeatableread级别:

select@@tx_isolation;

2、先在a端在开启的事务内进行查询。

然后在b端修改数据库的内容。

最后再在a端的同一事务内进行查询,发现结果一致。

mysql 详解隔离级别操作过程(cmd)

 serializable是*的隔离级别

1、在a端设置隔离级别为serializable

set transactionisolation level serializable;

在a端开启一个事务-并对stud表进行查询。

在b端开启一个事务,并写入一行记录。此时发现b的代码并没有执行,因为它在等a提交之后它才执行。

类似于线程同步的概念

mysql 详解隔离级别操作过程(cmd)

 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

脏读(drity read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个rollback(回滚)了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(phantom read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!