测试你对MySQL事务与隔离级别的理解的一道题

之前写过一篇《MySQL InnoDB 四种事务隔离级别 与脏读、可重复读、幻读》

http://blog.csdn.net/seven_3306/article/details/27085275

这是我自己琢磨出来的一道关于MySQL事务和隔离级别的题目,请填写问号部分的内容:

如果你能正确的说明出如下结果,那么你应该对MySQL事物和隔离级别有一定的认识了。

如果不是,那么可能你并不理解MySQL的事务和隔离级别。

另外这道题可以帮你理解为什么有的时候会出现这个问题:

ERROR 1205 (HY000): Lock wait timeout exceeded;  
 try restarting transaction

理解了这个错误的原因,就可以解决这个问题了。

MySQL 数据库有表

create table t(a int)engine=innodb,charset=utf8;

insert into t(a)values(0);

MySQL在两个session中按照如下顺序执行如下命令:

session  A session B
   
set session transaction  isolation level read committed;  
SET AUTOCOMMIT=0; set session transaction isolation level read committed;
  SET AUTOCOMMIT=0;
SELECT a FROM t;  
结果:0  
   
  SELECT a FROM t;
  结果:0
   
   
UPDATE t SET a = a+1;  
SELECT a from t;  
结果:?  
   
   
  SELECT a from t;
  结果:?
   
  UPDATE t set a=a+5;
结果:

   
   
COMMIT;(ROLLBACK)  
  SELECT a FROM t;
  结果:? (如果session  A被rollback,则为?)
   
  COMMIT
   
  SELECT a FROM t;
  结果:?(如果session  A被rollback,则为?)
SELECT a FROM t;  
结果:?(如果session A被rollback,则为?)  

结果是:

session  A session B
   
set session transaction  isolation level read committed;  
SET AUTOCOMMIT=0; set session transaction isolation level read committed;
  SET AUTOCOMMIT=0;
SELECT a FROM t;  
结果:0  
   
  SELECT a FROM t;
  结果:0
   
   
UPDATE t SET a = a+1;  
SELECT a from t;  
结果:1  
   
   
  SELECT a from t;
  结果:0
   
  UPDATE t set a=a+5;
  结果:被阻塞住了,再等待session  A的事务提交,也就是等待session A释放锁

一、如果session A超过一定时间没有释放锁(提交事务),

则session B因锁等待超时:ERROR 1205 (HY000): Lock wait timeout exceeded;

try restarting transaction

2、如果session A在session B锁等待超时前提交了事务,则session B执行update a =a+1;

Innodb锁等待时间为:show variables like ‘%innodb_lock_wait_timeout%‘;(Global,  Session级别)

3、如果session A在session B锁等待超时前执行了rollback,则session B执行update a=a+1;

   
   
COMMIT;(ROLLBACK)  
  SELECT a FROM t;
  结果:(一、报错。 二、6  三、如果session A被rollback,则为5)
   
  COMMIT
   
  SELECT a FROM t;
  结果:(一、报错。 二、6  三、如果session A被rollback,则为5
SELECT a FROM t;  
结果一、如果session B锁等待超时,则为1

二、如果session B未超时,且session A提交事务则为6

三、如果session A被rollback,则为5)

 

思考,换成其它事务隔离级别,那么结果又是什么?

时间: 2024-10-13 23:45:38

测试你对MySQL事务与隔离级别的理解的一道题的相关文章

Mysql事务的隔离级别

注:转 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默

MySQL事务四个隔离级别

MySQL事务隔离级别详解             MySQL数据结构SQL SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted (读取未提交的内容)  在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Commit

mysql事务隔离级别以及有问题的读取(脏读,不可重复读,幻象读)

1.事务里一些有问题的读取:脏读,不可重复读,幻象读 脏读 (dirty read)事务T1更新了一行记录的内容,但是并没有提交所做的修改.事务T2读取更新后的行,然后T1执行回滚操作,取消了刚才所做的修改.现在T2所读取的行就无效了. 不可重复读取 (nonrepeatable read)事务T1读取一行记录,紧接着事务T2修改 了T1刚才读取的那一行记录.然后T1又再次读取这行记录,发现与刚才读取的结果不同.这就称为“不可重复”读,因为T1原来读取的那行记录已经发生了变化. 幻像读取 (ph

Mysql事务隔离级别学习

这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级别. Mysql数据库总共分为四个事务隔离级别,其中默认的事务隔离级别是:repeatable read,而与其它的数据库不同的是,其它的数据库默认事务隔离级别是read committed(SQL Server.Oracle). 第一步:SERIALIZABLE Instance 1: Insta

mysql事务以及隔离级别

mysql事务以及隔离级别 1. 简介 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 2. 事务的基

MySQL 事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

事务隔离级别的理解

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读.下面通过事例一一阐述它们的概念与联系. Read uncommitted 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据. 事例:老板要给程序员发工资,程序员的工资是3.6万/月.但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户

MySQL事务详解

事务:Transaction 多个sql语句,要么同时都执行,要么同时都不执行 事务就是一组原子性的(select)查询语句,也即将多个查询当作一个独立的工作单元 ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务 A:Atomicity,原子性,都执行或者都不执行 C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态 I:Isolaction,隔离性.一个事务的所有修改操作在提交前对其他事务是不可见的 D: Durability, 持久性,一旦事务得到提交,其

Mysql事务&字符集

Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: 2.Read committed 读已提交: 3.Repeatable read 可重复读,类似oracle利用undo的闪回查询: 4.Serializable 串行读,很少用. 隔离级别的修改: 通过set命令: 通过修改配置文件,启动数据库的默认隔离级别-mysqld Mysql字符集 My