`
lovnet
  • 浏览: 6709371 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

InnoDB隔离级别与锁机制.txt

 
阅读更多
mysql> show global variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)


mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)


mysql> show global variables like 'tx_isolation';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+

1 row in set (0.00 sec)


  1. Read committed事务隔离级别下,对于快照数据,“一致性的非锁定读”总是读取被锁定行的最新一份快照数据。
  1. Repeatable read事务隔离级别下,对于快照数据,“一致性的非锁定读”总是读取事务开始时的行数据版本。

测试条件:

在一行进行deleteupdate操作时,读操作不会等待该行锁的释放,而会读取一个快照版本。

测试涉及的知识:


隔离级别

读数据一致性

脏读

不可重复读

幻读

未提交读(Read uncommitted

最低级别,只能保证不读取物理上损坏的数据

已提交度(Read committed

语句级

可重复读(Repeatable read

事务级

可序列化(Serializable

最高级别,事务级

锁类型

共享锁(S Lock),允许事务读一行数据

排他锁(X Lock),允许事务删除或者更新一行数据

意向锁(表级别)

意向共享锁(IS Lock),事务想要获得一个表中某几行的共享锁

意向排他锁(IX Lock),事务想要获得一个表中某几行的排他锁

对读操作进行加锁

select ... for update

x锁,可以防止丢失更新的问题

select ... lock in share mode(在Serializable事务级别下,每条select语句,自动加上lock in share mode

s

锁算法

record lock单个行记录上的锁

gap lock间隙锁,锁定一个范围,但不锁定记录本身

next-key lock锁定一个范围,并且锁定记录本身(在Repeatable read事务级别下,使用该算法,可避免幻读的产生。)

多版本并发控制,MVCC

注意:在MySQL5.5中,我尝试动态更改tx_isolation,结果报错,该参数不能更改。修改my.cnf,重启服务。

测试环境:

MySQL 5.5

创建一个测试表

create table t (a int not null primary key , b varchar(100));

insert into t select 1,'abc';

测试过程

  1. READ-COMMITTED隔离级别

mysql> show global variables like 'tx_isolation';

+---------------+----------------+

| Variable_name | Value|

+---------------+----------------+

| tx_isolation| READ-COMMITTED |

+---------------+----------------+

1 row in set (0.00 sec)


session 1

session 2

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where a=1;

+---+------+

| a | b|

+---+------+

| 1 | abc|

+---+------+

1 row in set (0.00 sec)

开始一个事务,并读取a=1这行的记录。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> update t set a=2 where a=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1Changed: 1Warnings: 0

同样开始一个事务,并更改a=1这样的记录,先不提交。

a=1这一行就获得了一个X锁。

mysql> select * from t where a=1;

+---+------+

| a | b|

+---+------+

| 1 | abc|

+---+------+

1 row in set (0.00 sec)

再次查询,可以查询,但是记录是未改变的。

分析:

“一致性的非锁定读”总是读取被锁定行的最新一份快照数据。

mysql> commit;

Query OK, 0 rows affected (0.01 sec)

mysql> select * from t where a=1;

Empty set (0.00 sec)

测试数据还原

mysql> update t set a=1 where a=2;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1Changed: 1Warnings: 0

  1. Repeatable read

mysql> show global variables like 'tx_isolation';

+---------------+-----------------+

| Variable_name | Value|

+---------------+-----------------+

| tx_isolation| REPEATABLE-READ |

+---------------+-----------------+

1 row in set (0.00 sec)

s


session 1

session 2

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where a=1;

+---+------+

| a | b|

+---+------+

| 1 | abc|

+---+------+

1 row in set (0.00 sec)

开始一个事务,并读取a=1这行的记录。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> update t set a=2 where a=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1Changed: 1Warnings: 0

同样开始一个事务,并更改a=1这样的记录,先不提交。

a=1这一行就获得了一个X锁。

mysql> select * from t where a=1;

+---+------+

| a | b|

+---+------+

| 1 | abc|

+---+------+

1 row in set (0.00 sec)

再次查询,可以查询,但是记录是未改变的。

mysql> commit;

Query OK, 0 rows affected (0.01 sec)

mysql> select * from t where a=1;

+---+------+

| a | b|

+---+------+

| 1 | abc|

+---+------+

1 row in set (0.00 sec)

session 2提交了事务,但是这里读取的记录仍然未改变

分析:

“一致性的非锁定读”总是读取本次事务开始时的行数据版本。

mysql> select * from t where a=1;

Empty set (0.00 sec)

读取不到数据是理所当然的。


分享到:
评论

相关推荐

    InnoDB锁机制学习笔记

    MySQL的引擎简介,InnoDB的锁机制与事务隔离级别

    innodb如何巧妙的实现事务隔离级别详解

    锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实现事务的隔离特性中的4种隔离级别。 事务ACID特性,其中I代表隔离性(Isolation)。...

    MySQL的Innodb中的事务隔离级别和锁的关系

    这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。  #一次封锁or两段锁?  因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,是在...

    InnoDB的多版本并发控制机制——MVCC

    InnoDB多版本并发控制机制MVCC的原理与实现,包括底层代码实现以及快照的构建原理。RR隔离级别和RC隔离级别的实现逻辑。

    Java面试Mysql.pdf

    sql的执行顺序 索引的优点和缺点 怎么避免索引失效(也...隔离级别与锁的关系 按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法 从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了

    MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法...

    解析数据库锁协议和InnoDB的锁机制(全面解析行级锁、表级锁、排他锁、共享锁、悲观锁、乐观锁等常用锁)

    如果对事务隔离级别以及并发事务带来的问题不熟悉可以翻阅我的另外一篇博文–《解析事务隔离(事务隔离是如何解决脏读、幻读、不可重复读等问题)》 这篇文章中会涉及一些MVCC以及快照读、当前读的概念,如果不是很...

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 4_InnoDB事务隔离级别详解.mp4 │ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1_课堂作业讲解.mp4 │ 2_MySQL...

    MySQL面试专题18道.pdf

    1.数据库三范式是什么? 2.有哪些数据库优化方面的经验? 3.请简述常用的索引有哪些种类? 4.以及在 mysql 数据库中索引的工作机制是什么?...10.MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区 别?

    MySQL锁机制与用法分析

    本文实例讲述了MySQL锁机制与用法。分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是...

    MySQL InnoDB中的锁机制深入讲解

    锁机制(Locking)就是解决这类问题的最好武器。 首先新建表 test,其中 id 为主键,name 为辅助索引,address 为唯一索引。 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` int(11) NOT...

    Java初级、中级、高级面试题及答案

    事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...

    详谈innodb的锁(record,gap,Next-Key lock)

    Record lock单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql...

    MySQL之锁和事务

    目录一、锁分类死锁二、事务事务特性隔离级别多版本并发控制MVCC 一、锁 分类 Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。 表级锁 对当前操作的整张表加锁,...

    常见(MySQL)面试题(含答案).docx

    MyisAM和innodb的有关索引的...Myql中的事务回滚机制,持久性,隔离级别的实现 说一说drop、delete与truncate的区别 什么叫视图?游标是什么? 什么是存储过程?用什么来调用? 内连接、自连接、外连接(左、右、全)

    mysql中的锁机制深入讲解

    本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,...

    MySQL进阶学习-笔记整理

    2.1、事务隔离级别及琐机制 2.2、MVCC多版本并发控制机制 3、Mysql日志 3.1、总体架构 3.2、INNODB日志 4、全局优化 4.1、全局参数配置 5、8.0新特性 5.1、Mysql8.0.17新特性 6、安装集群 6.1、单机版本 6.2、主从...

    27道高级开发数据库面试题目以及答案.pdf

    数据库事务隔离级别; 事务的并发导致的问题; 数据库事务设置不同的隔离级别会导致的不同并发问题 当前读和快照读的意义; mvcc:多版本控制: 指的是一种提高并发的技术,其解决问题是什么; MVCC实现过程; mvcc三大...

    MySQL事务与锁机制详解

    1.事务 1.1 什么是事务? 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.2 哪些引擎支持事务 ...隔离性(Isolation):一个事务的执行过程中,不应该受到其他事务的干扰。对隔

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    5.4 选择合适的事务隔离级别 168 5.4.1 事务的概念 168 5.4.2 事务的实现 169 5.4.3 事务隔离级别介绍 171 5.5 sql优化与合理利用索引 177 5.5.1 如何定位执行很慢的sql语句 177 5.5.2 sql优化案例分析 178 ...

Global site tag (gtag.js) - Google Analytics