mysql 事务隔离级别
一、事务隔离级别介绍
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
事务隔离级别
MySQL隔离级别定义了事务与事务之间的隔离程度
二、不考虑隔离性,可能会引发如下问题
脏读( dirty read ):当一个事务读取另一个事务尚未提交的改变(update,insert,delete)时,产生脏读
不可重复读( nonrepeatable read ):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
幻读( phantom read ):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
三、演示MySQL的事务隔离级别
1、读未提交(READ UNCOMMITTED)
(1)、脏读
-- 1. 开了两个 mysql 的控制台 -- 2. 查看当前 mysql 的隔离级别 SELECT @@tx_isolation; -- 3.把其中一个控制台的隔离级别设置 Read uncommitted SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
--控制台1 --开启事务 start transaction; use haoke; CREATE TABLE `account`( id INT, `name` VARCHAR(32), money INT); insert into account value(100,'hawk',1000); --控制台2 --开启事务 start transaction; use haoke; select * from account;
控制台1的事务还未提交,控制台2就查到数据,这就是脏读。
(2)、不可重复读、幻读(基于以上继续操作)
--控制台1 update account set money = 800 where id=100; insert into account values(200,'jack',2000); --提交事务 commit; --控制台2 select * from account;
控制台2的事务还未commit,由于控制台1的提交影响了控制台2对表数据的读取,就产生了不可重复读、幻读。
通俗的说,就是当两个事务A、B连接到数据的同一表时,希望所能读取到的数据就是在事务连接到表(开启事务)这一时刻的数据
2、读已提交(READ COMMITTED)
--把其中一个控制台2的隔离级别设置 Read committed SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
读已提交不会产生脏读
读已提交的隔离级别下产生不可重复读和幻读
3、可重复读(Repeatable read)
可重复读不会产生脏读
可重复读的隔离级别下不会产生不可重复读和幻读
4、可串行化(Serializable)
两个事务A、B,当事务A在操作表时且事务A未commit,此时,当事务B试图操作表时,会检查事务A是否commit,如果A未commit,事务B会一直等待。