`
uule
  • 浏览: 6305867 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Mysql for update行级锁、表级锁、页级锁

 
阅读更多

MySQL中SELECT+UPDATE处理并发更新问题解决方案分享

SELECT FOR UPDATE

MySQL行级锁、表级锁、页级锁详细介绍

 

mysql悲观锁总结和实践

 

1、如果对读的响应度要求非常高,比如证券交易系统,那么适合用乐观锁,因为悲观锁会阻塞读

2、如果读远多于写,那么也适合用乐观锁,因为用悲观锁会导致大量读被少量的写阻塞

3、如果写操作频繁并且冲突比例很高,那么适合用悲观写独占锁

 

由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

 

举个例子:

假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。

 

例1: (明确指定主键,并且有此数据,row lock)

SELECT * FROM products WHERE id='3' FOR UPDATE;

 

例2: (明确指定主键,若查无此数据,无lock)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

 

例2: (无主键,table lock)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

 

例3: (主键不明确,table lock)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

 

例4: (主键不明确,table lock)

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

 

注1: FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。

注2: 要测试锁定的状况,可以利用MySQL 的Command Mode ,开二个视窗来做测试。

 

======================================================================

页级:引擎 BDB。

表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行

行级:引擎 INNODB , 单独的一行记录加锁

 

表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许

行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。

页级,表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

 

MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。

对WRITE,MySQL使用的表锁定方法原理如下:

如果在表上没有锁,在它上面放一个写锁。

否则,把锁定请求放在写锁定队列中。

对READ,MySQL使用的锁定方法原理如下:

如果在表上没有写锁定,把一个读锁定放在它上面   

否则,把锁请求放在读锁定队列中。

InnoDB使用行锁定,BDB使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。 

行级锁定的优点:

·         当在许多线程中访问不同的行时只存在少量锁定冲突。

·         回滚时只有少量的更改。

·         可以长时间锁定单一的行。

行级锁定的缺点:

·         比页级或表级锁定占用更多的内存。

·         当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。

·         如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。

·         用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

==================================================================================

 

 

分享到:
评论

相关推荐

    MySQL中的行级锁、表级锁、页级锁

    在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。 一、行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少...

    MySQL行级锁、表级锁、页级锁详细介绍

    页级:引擎 BDB。表级:引擎 MyISAM , 理解为锁住整个表,可以同时...MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。对WRITE,MySQL使用的表锁定方法原理如下:如果在表

    MySQL中的行级锁定示例详解

    锁是在执行多线程时用于强行限定资源访问的同步机制,数据库锁根据锁的粒度可分为行级锁,表级锁和页级锁 行级锁 行级锁是mysql中粒度最细的一种锁机制,表示只对当前所操作的行进行加锁,行级锁发生冲突的概率很...

    MySQL锁的用法之表级锁

    MySQL的锁分为表级锁、页级锁与行级锁。表级锁是MySQL中粒度大的一种锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。常使用的MYISAM与INNODB都支持表级锁定。  表级锁定分为两类,读锁与写锁。读锁是预期...

    Mysql 行级锁的使用及死锁的预防方案

     mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务。使用mysql锁的时候有时候会出现死锁,要做好死锁的预防。 二、MySQL行级锁  行级锁又分共享锁和排他锁。  共享锁:  名词解释:共享锁又...

    mysql锁表和解锁语句分享

    页级的典型代表引擎为BDB。...2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。 3)、容易出现死锁。 对于写锁定如下: 1)、如果表没有加锁,那么对其加写锁定。

    MySQL锁机制与用法分析

    InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下采用行级锁。 MySQL这3种锁的特性可大致归纳如下: (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 (2)...

    mysql-batch:小批量运行大型MySQL UPDATE和DELETE查询,以防止表行级锁定

    该工具将小批量运行UPDATE和DELETE查询,以防止表级和行级锁定(使用InnoDB)。 如果必须更新或删除大量行,则也可以限制一次选择的行数。安装 pip3 install mysql_batchUPDATE示例您可以使用可用的模式运行此示例...

    MySQL死锁问题分析及解决方法实例详解

    InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 2、各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生...

    mysql锁定单个表的方法

    mysql锁定单个表的方法 代码如下:mysql&gt;lock table userstat read; mysql&gt;unlock tables;... 行级锁的缺点如下: 1)、比页级锁和表级锁要占用更多的内存。 2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我

    mysql共享锁与排他锁用法实例分析

    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,...

    MySQL中InnoDB存储引擎的锁的基本使用教程

    InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生冲突的概率最高,并发度最低 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小...

    Mysql 进阶修行学习

    存储引擎:体系结构、InnoDb了解、MyISAM和Memory、引擎选择 索引:结构、Btree、索引分类、索引语法、性能分析、...锁:全局锁、表级锁、行级锁 InnoDB引擎:架构、事务原理、MVCC Mysql管理:系统数据库、常用工具

    MySql整理(基础进阶运维).docx

    语法,使用规则,设计原则,SQL优化,插入数据,主键优化,orderby优化,groupby优化,limit优化,count优化,update优化(避免行锁升级为表锁),视图/存储过程/触发器,视图,存储过程,锁(重点),概述,全局锁,表级锁,行级锁,...

    mysql和oracle的区别(功能性能、选择、使用它们时的sql等对比)

    虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。 oracle: oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的...

    2019最新21个MySQL高频面试题介绍

    表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量 最低。 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。 2、Mysql支持事务吗? 在缺省模式下,...

    MySQL存储引擎MyISAM与InnoDB区别总结整理

    MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心; 以下是MySQL 5.7 MyISAM存储引擎的版本...

    mysql学习之引擎、Explain和权限的深入讲解

    该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型...

    mysql存储过程事务管理简析

    1,MySQL的事务支持 1)MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Sql代码 代码如下: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务、行级锁、并发 Berkeley DB:支持...

    mysql数据库修改数据表引擎的方法

    对于MySQL数据库,如果你要使用事务以及行级锁就必须使用INNODB引擎。如果你要使用全文索引,那必须使用myisam。 INNODB的实用性,安全性,稳定性更高但是效率比MYISAM稍差,但是有的功能是MYISAM没有的。修改MySQL...

Global site tag (gtag.js) - Google Analytics