MySQL的行锁

概述

MySQL中的行所是基于索引的,行锁是锁定在索引上,所以如果某个字段没有索引,是无法上行锁的。

本文主要是实施验证的过程。

1.使用Innodb引擎建表

mysql> create table innodb(
    ->  id int,
    ->  name varchar(20),
    ->  city varchar(20)
    -> ) engine innodb default charset utf8
    -> ;
Query OK, 0 rows affected (0.01 sec)

2.不建索引进行测试

插入测试数据

mysql> insert into innodb values(1,‘name1‘,‘city1‘);
Query OK, 1 row affected (0.00 sec)

mysql> insert into innodb values(2,‘name2‘,‘city2‘);
Query OK, 1 row affected (0.00 sec)

mysql> insert into innodb values(3,‘name3‘,‘city3‘);
Query OK, 1 row affected (0.00 sec)

打开一个cmd连接mysql,我们成为session1,在session1中做如下操作

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from innodb where id=1 for update
    -> ;
+------+-------+-------+
| id   | name  | city  |
+------+-------+-------+
|    1 | name1 | city1 |
+------+-------+-------+
1 row in set (0.00 sec)

我们在session1中锁定了innodb表的id=1的记录

我们再新开一个cmd窗口,我们成为session2

mysql> update innodb set name=‘name1-1‘ where id=2;

这个时候我们可以看到session2会一直等待。

这就证明了对于没有索引的字段,mysql是没法加行锁的,实际上使用的是表锁

session1提交之后,session2也就更新成功了。

3.建立索引测试

对innodb表的id字段添加索引

mysql> alter table innodb add index idx_id(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

在session1中设置不自动提交,锁定id=1的行

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from innodb where id=1 for update;
+------+-------+-------+
| id   | name  | city  |
+------+-------+-------+
|    1 | name1 | city1 |
+------+-------+-------+
1 row in set (0.00 sec)

在session2中执行更新id=2的行

update innodb set name=‘name-bak‘ where id=2;

更新成功!

上述过程就证明了innodb的行锁就加到索引上的

MySQL的行锁

时间: 2024-10-04 02:43:31

MySQL的行锁的相关文章

Mysql InnoDB行锁实现方式

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁! 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能.下面通过一些实际例子来加以说明. (1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁. 在如表20-9所示的例子中,开始

Mysql InnoDB行锁实现方式(转)

Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁! 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能.下面通过一些实际例子来加以说明. (1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行

Mysql:行锁 表锁 乐观锁 悲观锁 读锁 写锁

锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行锁 锁定整个行数据,开销大,加锁慢,会出现死锁.锁定粒度小,发生锁冲突的概率低,并发度高. 表锁 锁定整个表数据,开销小,加锁快,不会出现死锁.锁定粒度大,发生锁冲突概率高,并发度低. 悲观锁 每次取数据时都认为别人会修改,所以每次取数据的时候都会上锁,这样别人想拿这个数据就会被阻

MySQL之行锁

前言 本章介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 准备 1. 创建表tb_innodb_lock,注意数据库引擎为InnoDB. CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20) ) ENGINE INNODB DEFAULT charset = utf8; insert into test_innodb_lock values (1,'a');

关于mysql事务行锁for update实现写锁的功能

 例子1: 在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. (for update仅仅适用于InnoDB) 我们都知道for update实际上是共享锁,是可以被读取的.但是如何在执行时,不被读取呢. 简单来说:假设现在库存为1,现在有A和B同时购买 先开启一个事务 begin; select stock from good where id=1 for update;//查询good表某

数据库进阶之路(五) - MySQL行锁深入研究

由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: SELECT restnum FROM book WHERE id =1 ; --如果restnum大于0,执行update UPDATE book SET restnum=restnum-1 WHERE id=1; 问题来了,当2个人同时借的时候,有可能第一个人执行select语句的时候,第二个人插了进来,在第一个人没来得及更新book

MySQL行锁深入研究

原文:http://blog.csdn.net/minipeach/article/details/5325161/ 做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统.假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为 [php] view plain copy Select   restnum  from  book  where  id =1 ; -- 如果 restnum 大于 0 ,执行 update Updat

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

本文参考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/article/details/53463596 有很多是转载合并过来. 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重

MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)

锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于数据库而言就显得尤为重要. MySQL锁 相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不