- 事务隔离级别
MySQL隔离级别(4种)脏读不可重复读幻读加锁读读未提交(readuncommitted)会出现会出现会出现不加锁读已提交(readcommitted)不会出现会出现会出现不加锁可重复读(repeatable read)不会出现不会出现不会出现不加锁可串行化(serializable)不会出现不会出现不会出现加锁可重复读实际上会发生幻读?
3.1读未提交(readuncommitted)
MySQL的事务隔离级别--案例我们举例一个案例来说明mysql的事务隔离级别 。以account表进行操作为例 。(id、name、money)

文章插图
- 开启两个mysql的控制台
- 查看当前mysql的隔离级别 , 均为可重复读
mysql> select @@tx_isolation;+-----------------+| @@tx_isolation|+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)
文章插图
- 将其中一个连接的隔离级别设置为 readuncommitted(读未提交)
-- 把其中一个控制台的隔离级别设置为read uncommittedSET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
文章插图
此时的情况:左边的隔离级别为读未提交;右边的隔离级别为可重复读
文章插图
- 然后两边都开启事务
文章插图
- 在两个连接控制台中选择数据库,在隔离级别为 可重复读 的连接中 创建表account
文章插图
- 再在隔离级别为 可重复读 的连接中插入一条数据(但未提交)
文章插图
在另一个连接(隔离级别为 读未提交 READ-UNCOMMITTED)中查询该表,发现可以查询到另一事务尚未提交的插入的数据,这时就发生了脏读
脏读:当一个事务读取另一个事务尚未提交的改变(delete,insert,update)时,产生脏读

文章插图
- 在隔离级别为 可重复读 的连接中更新一条数据,同时插入一条数据,然后提交commit
文章插图
此时在另一个连接(隔离级别为 读未提交)中 , 查询同一张表,可以看到在这个(隔离级别为 读未提交的)连接中,已经可以看到另一个事务中提交的数据
即一个事务的操作影响了另一个事务的查询 , 这时候就发生了不可重复读和幻读
这将会导致,当有多个连接开启事务时,某一连接的事务的查询会受到其他所有连接的事务的影响,这无疑将会导致混乱
最佳情况应该是:一个连接 连接到数据库,操作account表的时候,希望看到的数据应该是 , 开启事务的这一时刻的数据
文章插图
- 在连接(隔离级别为 读未提交)中提交commit结束一个事务 , 此时两个连接中的事务均已结束
例子
- 在上个例子开启的两个连接中,将其中一个连接的隔离级别修改为 读已提交,

文章插图
另一个保持隔离级别为可重复读

文章插图
- 两边都开启事务

文章插图
- 在隔离级别为可重复读的连接中插入一条数据
文章插图
然后在隔离级别为读已提交的连接中 插询表account,可以看到查询到的数据还是本连接开启事务时的数据
即,读已提交的隔离级别不会出现脏读现象推荐阅读
- MySQL 窗口函数
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- mac通过docker一键部署MySQL8
- day07-2MySQL索引
- CentOS部署MySQL
- MySQL用户也可以是个角色
- python+request+pymysql+pytest数据驱动
- CentOS 7.9 安装 MySQL 5.7.35
- 关于windows-server-下MySQL Community版本的的安装与配置
- InnoDB关于事务、锁、MVCC专题