Heim >Datenbank >MySQL-Tutorial >MYSQL演示关系型数据库的隔离级别_MySQL

MYSQL演示关系型数据库的隔离级别_MySQL

WBOY
WBOYOriginal
2016-06-01 13:07:431183Durchsuche

关系型数据库并发访问存在的问题:

脏读:对于两个事物 T1、T2,T1 读取了已经被 T2 更新但还没有被提交的字段.。之后, 若 T2 回滚,T1读取的内容就是临时且无效的。

 

不可重复读:对于两个事物 T1、T2,T1 读取了一个字段,然后 T2 更新了该字段。之后,T1再次读取同一个字段,值就不同了。

 

幻读:对于两个事物 T1、T2,T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行。之后,如果 T1 再次读取同一个表,就会多出几行.

 

数据库事务的隔离性:

数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

 

数据库的隔离级别:

MYSQL演示关系型数据库的隔离级别_MySQL 

MYSQL演示如下:

查看当前mysql数据库的隔离级别:

MYSQL演示关系型数据库的隔离级别_MySQL

设置mysql数据库禁止自动提交(默认为1):

 MYSQL演示关系型数据库的隔离级别_MySQL

 

以下操作都是在test数据库isolation表中进行:

MYSQL演示关系型数据库的隔离级别_MySQL

一、在READ  UNCOMMITTED隔离级别下:

1、设置数据库的隔离级别为read uncommitted:

MYSQL演示关系型数据库的隔离级别_MySQL

2、开启两个事务T1、T2:

T1:

 MYSQL演示关系型数据库的隔离级别_MySQL

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

3、在T2中修改id=00002的name=guanyunchang,不提交在T1中查询:

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

出现了脏读问题。

4、T2回滚:

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

 

二、在READ  COMMITTED隔离级别下:

1、设置数据库隔离级别为read committed:

MYSQL演示关系型数据库的隔离级别_MySQL

2、开启两个事务T1、T2:

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

 

3、在T2中修改id=00002的name=guanyunchang,不提交在T1中查询:

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

脏读问题不存在。

4、T2提交:

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

出现了不可重复读问题。

三、在REPEATABLE  READ隔离级别下:

1、设置数据库隔离级别为repeatable read:

MYSQL演示关系型数据库的隔离级别_MySQL

2、开启两个事务T1、T2:

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

3、在T2中修改id=00002的name=guanyunchang

MYSQL演示关系型数据库的隔离级别_MySQL

T2不提交,在T1中查询:

MYSQL演示关系型数据库的隔离级别_MySQL

脏读问题不存在。

T2提交,在T1中查询:

MYSQL演示关系型数据库的隔离级别_MySQL

不可重复度问题不存在。

4、在T2中插入一条数据id=00004、name=zhugeliang并提交

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

出现幻读问题。

 

四、在SERIALIZABLE隔离级别下:

1、设置数据库隔离级别为serializable:

MYSQL演示关系型数据库的隔离级别_MySQL

2、开启两个事务T1、T2:

T1:

MYSQL演示关系型数据库的隔离级别_MySQL

T2:

MYSQL演示关系型数据库的隔离级别_MySQL

 

3、在T2中修改id=00003的name=zhangyide:

MYSQL演示关系型数据库的隔离级别_MySQL

在事务T1持续期间,不允许T2插入、修改、删除操作。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn