3.事务的四种隔离级别
- 事务隔离级别介绍
- 多个连接开启各自的事务,操作数据库中的数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据是的准确性 。
- 如果不考虑隔离性,可能会引发如下问题:
- 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(delete,insert,update)时,产生脏读
- 不可重复读(nonrepeatable read):同一个查询在同一事务中多次进行,由于其他已提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
- 幻读(phantom read):虚读,同一查询在同一事务中多次进行,由于其他已提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
- 事务隔离级别
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
文章插图
此时在另一个连接(隔离级别为 读未提交)中,查询同一张表,可以看到在这个(隔离级别为 读未提交的)连接中,已经可以看到另一个事务中提交的数据
即一个事务的操作影响了另一个事务的查询,这时候就发生了不可重复读和幻读经验总结扩展阅读
- 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专题