概念:多个连接在开启各自的事务操作数据库的时候,数据库要负责隔离级别,以保证数据的准确性。
不考虑隔离性的话可能引发以下问题:
1、脏读:一个事务读取到了另一个事务未提交的数据
2、不可重复读:一个事务中进行了多次查询,但是由于其他事务的修改和删除,每次返回的结果都是不一样的,此时发生不可重复读(a事务统计十点前的数据,b十点以后操作事务,进行了修改和删除的提交,a读到了这个b的数据,因此发生不可重复读)
3、幻读:同一个查询在同一事务中多次进行,由于其他提交事务的插入操作,每次返回的结果不同,因此返回的不同的结果集,此时发生幻读。
事务的隔离级别概念:Mysql隔离级别定义了事务和事务之间的隔离程度。
四种隔离级别:
读未提交
读已提交
可重复读
可串行化
查看当前的连接的隔离级别
select @@tx_isolation
数据库默认的隔离级别是可重复读。
========================================
右边设置事务的隔离级别为:读未提交:
=====================================================
开启事务;
-----------------------------
左边插入一条数据,并显示当前表内容:
右边此时查询数据库:
左边还没有提交数据,但是右边却看到了数据,因此发生了脏读。
=========此时左边连接再进行一次修改,以及一次添加。
========右边连接获取数据:
将修改和添加的数据都查询出来了,发生不可重复读与幻读。因此读未提交发生了脏读,不可重复读,以及幻读。
==============读已提交============
先将两个事务提交。
再开启新的事务。
=========
左边的事务进行增加修改操作,并提交(未提交时,右边没有变化,也就是说不会出现脏读现象)
此时右边获取到了已提交的数据,
这时出现了一个问题,那就是我希望右边得到的数据是连接表时,那一刻的数据,但是现在表中数据不符合我的期望,它出现了不可重复读和幻读。这就是读已提交的缺陷。
===========可重复读=============
右边:
----------------
左边:先添加一条数据,并修改一条数据
此时右边查询会发现还是原来的数据;
----------
当左边提交了事务 ,
右边事务查询时依旧是原来的数据,无论怎么查询,右边始终是这三条数据,因此不会出现不可重复读和幻读现象。
========可串行化============
右边设置事务隔离级别为可串行化,并开启事务,
左边也开启事务,
左边开启事务并添加与修改。 此时右边进行一次查询就会出现一个问题,会卡住,
因为左边还没有提交,右边表是串行的,它去查询时,会发现还没提交,那么右边就会进入等待状态。
左边一提交,右边就可以查了。
============================================================隔离级别相关指令
select @@tx_isolation 当前会话的隔离级别
SELECT @@global.tx_isolation; 系统当前隔离级别
SET SESSION TRANSACTION ISOLATION level read UNCOMMITTED 设置会话隔离级别
SET GLOBAL TRANSACTION ISOLATION level 设置系统隔离级别
默认是可重复读,基本不需要改动。