mysql 行锁,表锁 测试

环境:mysql5.5,引擎innodb,SQLYOG

行锁,表锁区别:其实就是看where后面的条件是否有有索引,有索引的时候就是行锁,没有索引的时候就是表索。

先创建表结构:

CREATE TABLE `lock_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

再向里面添加数据:

INSERT INTO lock_test (NAME,age) VALUES(‘zangsan‘,15);
INSERT INTO lock_test (NAME,age) VALUES(‘zangsan1‘,16);
INSERT INTO lock_test (NAME,age) VALUES(‘zangsan2‘,17);
INSERT INTO lock_test (NAME,age) VALUES(‘zangsan3‘,18);
INSERT INTO lock_test (NAME,age) VALUES(‘zangsan4‘,19);
INSERT INTO lock_test (NAME,age) VALUES(‘zangsan5‘,20);

一、无索引测试 :

      Session1:     

SET autocommit=0;

SELECT * FROM lock_test;

SELECT * FROM lock_test WHERE NAME = ‘zangsan‘ FOR UPDATE;

Session2:(在SQLYOG中新开一个连接)

UPDATE  lock_test SET age=30 WHERE NAME = ‘zangsan1‘ ;

此时你会发现这条SQL一直处于处于等待状态....

现在我们回到 Session1: 中,再执行:COMMIT;语句。

        我们会在Session2的窗口看到:

        

        

        我们可以得出的结论是:在where条件后面接的条件是无索引的name字段,虽然我们锁的是值为zangsan的这条数据,实际上他是锁了整个表。



二 有索引测试:

    我们在Session1窗口中执行:

        ALTER TABLE lock_test ADD INDEX index_name(NAME);

然后再将上面的语过程重复一次。这时session2执行的update操作可以直接完成了。

我们可以得出的结论是:在where条件后面接的条件是带索引的name字段,他只会锁住该行数据。

    


时间: 2024-12-17 14:03:42

mysql 行锁,表锁 测试的相关文章

MySQL 行锁 表锁机制

MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项.还在等啥?经验等你来拿! MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁.后者的出现从某种程度上是弥补前者的不足.比如:MyISAM不支持事务,InnoDB支持事务.表锁虽然开销小,锁表快,但高并发下性能低.行锁

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

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

一不小心MYSQL成了表锁

大家都知道MYSQL数据库INNODB引擎是默认的行锁,但是今天意外发现我的数据库怎么变成表锁了,让我很费解~~~~ 1.首先看看我的数据库引擎 show variables like '%storage_engine%'; 2.创建test表 CREATE TABLE `test` (   `id` int(11) DEFAULT NULL,    `name` varchar(255) DEFAULT NULL    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

浅谈SQL Transaction在请求中断后的行锁表锁

最近在维护Web Service接口时,由于数据数据量达到千万级别,接口调用不时出现错误让人不胜烦恼,经过性能测试查出瓶颈在数据库数据处理上,可着实忙了一番.相信众多程序猿和DBA都会头痛性能的问题,尤其是应用程序池的超时和假死造成的后台数据处理中断,带来的数据维护带来不小的麻烦. 在此背景下追查后台处理数据时请求中断成为目前棘手的问题,被吊打之余正努力想办法解决根本问题,小弟在解决防止数据处理时请求中断上,想到了Transaction的可行性,于是有了这篇随笔出来,废话比较多,下面开始吧 首先

MySQL行、表锁定

一.前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种使用最为频繁的存储引擎MyISAM(表锁定)和Innodb(行锁定)各自的锁定机制进行较为详细的分析. MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQ

mysql - 表锁,行锁

MyISAM存储引擎:开销小,加锁快,无死锁.锁定粒度大,并发度低,容易发生锁冲突.   不支持事务.            采用表锁 (操作时对操作的表上锁) 基本不用了 innoDB存储引擎:开销大,有死锁,锁定粒度小,不容易发生冲突.                                                                       采用行锁(每句sql执行时对操作行上锁),但是也支持表锁     mysql默认引擎 问题:库存超卖 库存1,结果两个

MySQL中的锁(表锁、行锁)

锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂. 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快:不会出

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

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

MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于