Mysql隔离级别

来源:互联网 发布:mysql primarykey 编辑:程序博客网 时间:2024/05/16 12:43

先记录下几个概念:

脏读:在当前事务中,读取到其他事务中还未提交的数据

不可重复读:在当前事务中,读取某一行的数据,可能读出的数据不同

幻读:在当前事务中,读取记录时,另外的事务插入了新的记录,当前事务可能出现新的行。


四种隔离级别:

1.未提交读

可能读到脏数据



会话A中的隔离级别为未提交读


表中原来的数据


会话B中,启动一个实务,并且,修改其中一个数据


在会话A中可以看到提交之前的数据,即可以看到脏数据



在会话B中回滚之前的事务


会话A中查到回滚之后并未提交的数据。


2.提交读,可以避免脏读

可能发生不可重复读


在会话A中启动一个事务,查看全表的数据



在会话B中进行一个事务修改其中一个行



在会话A中可以看到这个变化


3.可重复读 可以避免不可重复读

但是可能出现幻读

在mysql5.1中没有发现幻读,可能和不同的数据库的实现有关(可能和MVCC有关)

4.可串行化 可以避免幻读(将所有读取的行都加了锁)


MVCC:Multi-Version Concurrency Control 多版本并发控制

InnoDB的MVCC是通过没行记录后面保存两个隐藏的列来实现的。

一个保存了行的创建时间,另一个保存了删除时间。时间用版本号来记录,每开始一个事务系统版本号就递增。

REPEATABLE READ隔离等级下

INSERT 新插入和每一行保存当前系统版本号为创建时间

DELETE 删除的每一行保存当前系统版本号位删除时间

UPDATE 插入一条新的数据,保存当前系统版本号作为创建时间,同时保存当前系统版本号到原来的行作为删除时间

SELECT 查找早于当前事务版本号的行,并且要查找删除版本号大于当前事务版本号的行。

(解释了为什么插入新行没有显示)


附:mysql的一些基本操作

建表:create table 表名 (id int, num int) type=innodb;

查看表类型:show create table 表名;

查看会话隔离级别:select  @@tx_isolation;

查看全集隔离级别: select @@global.tx_isolation;

修改会话隔离级别:set session tx_isolation='read-uncommitted';



0 0
原创粉丝点击