MySQL事务隔离级别及演示

目录


事务的概述

事务的隔离级别

事务的隔离级别的演示:演示脏读

事务的隔离级别的演示:避免脏读和不可重复读的发生

事务的隔离级别的演示:避免不可重复读

事务的隔离级别的演示:演示串行化


事务的概述

  1. 事务:指的是一组逻辑操作,要么同时成功要么同时失败。
  2. 使用事务:
    a、开启事务、提交事务:

b、开启事务,回滚事务:

3. 事务的四大特性:

原子性:组成事务的最小单元是不可分割的,要么同时成功要么同时失败。

一致性:执行事务前后,数据的完整性是一致的;(也就是案例中总钱数是一样的)

隔离性:在数据库中,各个事务之间是独立的额,不受其他事务的影响。

持久性:事务一旦结束,数据就会序列化到数据库中。

事务的隔离级别

           脏读:一个事务读到了另一个事务未提交的数据。

不可重复读:一个事务读到了另一个事务已经提交的update数据

虚读/幻读:一个事务读到了另一个事务已经提交的insert数据

事务的隔离级别

read uncommitted :脏读,不可重复读,虚读都有可能发生

read committed :避免脏读。但是不可重复读和虚读是有可能发生

repeatable-read :避免脏读和不可重复读,但是虚读有可能发生。(mysql默认隔离级别)

serializable :避免脏读,不可重复读,虚读。

从上到下级别越来越高,但是效率越来越低。

事务的隔离级别的演示:演示脏读

设置事务隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;

查看事务的隔离级别:select @@tx_isolation;

演示思路

  1. 开启两个窗口A和B;
  2. 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL read committed;
  3. 在A和B两个窗口中开启事务
  4. 在B窗口完成转账操作,但不提交事务。
  5. 在A窗口查询数据,会发现发生了脏读

事务的隔离级别的演示:避免脏读和不可重复读的发生

演示思路:

1、 开启两个窗口A和B;

2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;

3、 在A和B两个窗口中开启事务

4、 在B窗口完成转账操作,但不提交事务。

5、 在A窗口查询表数据,会发现没有转账成功,也就是说没有查询到另一个事务未提交的数据,避免了“脏读”;

6、在B窗口提交事务,

7、在A窗口查询数据,会发现两次数据不一样,也就发生了“不可重复读”

事务的隔离级别的演示:避免不可重复读

演示思路:

1、 开启两个窗口A和B;

2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL repeatable-read;

3、 在A和B两个窗口中开启事务

4、 在B窗口完成转账操作,但不提交事务。

5、 在A窗口查询表数据,会发现没有转账成功,也就是说没有查询到另一个事务未提交的数据,避免了“脏读”;

6、在B窗口提交事务,

7、在A窗口查询数据,会发现两次数据一致,也就说避免了“不可重复读”

事务的隔离级别的演示:演示串行化

演示思路:

1、 开启两个窗口A和B;

2、 设置A窗口的隔离:SET SESSION TRANSACTION ISOLATION LEVEL serializable;

3、 在A和B两个窗口中开启事务

4、 在B窗口中插入一条记录,但不提交事务。

5、 在A窗口查询表数据,发现A窗口已经卡住了(说明事务不允许出现并发,A窗口需要等待B窗口事务执行完成以后,才会执行A窗口的事务。)当B窗口的事务结束(提交或者回滚),那么A窗口马上就会出现结果。

发布了854 篇原创文章 · 获赞 375 · 访问量 79万+

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/104056179