`
uule
  • 浏览: 6348724 次
  • 性别: 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锁类型以及子查询锁表问题、解锁1

    在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...

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

    MySQL数据库在处理并发操作时,为了保证数据的一致性和完整性,使用了不同的锁机制,包括行级锁、表级锁和页级锁。这三种锁的粒度不同,各有优缺点,适用于不同的场景。 行级锁是MySQL中最细粒度的锁,仅锁定操作的...

    MySQL 全局锁、表级锁、行级锁

    在多用户环境中,为了保证数据的一致性和完整性,MySQL 提供了多种锁定机制,包括全局锁、表级锁和行级锁。这些锁机制是数据库事务处理中的核心组成部分,下面我们将详细探讨这些锁的特性和应用场景。 1. **全局锁...

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

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

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    FOR UPDATE`,在Java中,synchronized关键字和ReentrantLock的lock()方法都是悲观锁的例子。 3. **分布式锁**:在分布式系统中,由于进程间的内存不可见,需要一种跨节点的协调机制来实现锁。常见的分布式锁实现有...

    MySQL悲观锁总结和实践

    MySQL InnoDB 默认使用行级锁(Row-Level Lock),但在某些情况下可能会使用表级锁(Table Lock)。 - **行级锁(Row-Level Lock)**:当SQL语句中明确指定了主键或唯一索引时,MySQL将执行行级锁,只锁定被选取的...

    MySQL锁的用法之表级锁

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

    MySQL中的行级锁定示例详解

    在这种情况下,即使使用`FOR UPDATE`或`LOCK IN SHARE MODE`,InnoDB也可能升级为表级锁定,以确保数据的一致性。在这个示例中,窗口1试图通过`name`字段锁定行,由于`name`字段没有索引,可能导致整个表被锁定,...

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

    MySQL的InnoDB存储引擎支持事务处理,并且具备行级锁机制,这使得它在处理并发事务时具有较高的效率。行级锁分为共享锁(Read Lock)和排他锁(Write Lock),这两种锁的设计是为了实现并发读写操作。 共享锁,也...

    Mysql各种高级操作

    综上所述,锁机制是实现多用户并发访问的基石,无论是MyISAM表的表级锁还是InnoDB表的行级锁,都有其独特的应用场景和特点。了解并掌握这些锁机制,对于优化数据库性能、提高数据一致性具有重要意义。

    MySQL锁详细介绍

    7. **页级锁**:介于表级锁和行级锁之间,锁定的数据量比行级锁多,但比表级锁少,某些存储引擎支持页级锁。 在实际应用中,选择合适的锁类型和粒度是保证数据库并发性能的关键。例如,选择行级锁可以提高并发,但...

    Mysql 锁机制笔记1

    MySQL支持三种级别的锁:行级锁、页级锁和表级锁。其中,MyISAM存储引擎使用的是表级锁,而InnoDB则采用行级锁和表级锁,同时支持页级锁。 **1. 表级锁:** 表级锁是开销最小、加锁速度快的选择,但它的锁定粒度大...

    mysql锁表和解锁语句分享

    MySQL 中有三种锁的级别:页级、表级、行级。每种锁级别都有其典型的引擎,页级的典型代表引擎为 BDB,表级的典型代表引擎为 MyISAM、MEMORY 以及很久以前的 ISAM,行级的典型代表引擎为 INNODB。 行级锁是 MySQL ...

    MySQL与Java锁的学习

    MySQL数据库提供了多种锁机制来确保数据的一致性和完整性,主要分为两大类:行级锁和表级锁。 1. **行级锁**:这种类型的锁只锁定操作的数据行,允许其他事务在同一表的不同行上进行操作,提高了并发性。MySQL中的...

    MySQL:锁机制.pdf

    - InnoDB与MyISAM存储引擎的区别:InnoDB支持行级锁和事务,而MyISAM主要支持表级锁。 在使用过程中,应该根据实际的应用场景和性能需求,合理选择存储引擎和锁策略,以达到最优的并发控制效果。对于可能出现的锁争...

    Mysql 锁机制的详细说明

    - InnoDB 支持行级锁和表级锁,默认使用行级锁。 - MyISAM 使用表级锁。 - BDB 使用页面锁,也可用表级锁。 二、行锁 行级锁分为共享锁(读锁)和排他锁(写锁): A. 共享锁: - 允许读取数据,但不允许修改...

    行业-59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.rar

    在实际操作中,锁的粒度也是一个重要的概念,它可以是表级、页级、行级甚至更细粒度的锁。MySQL的InnoDB存储引擎支持行级锁定,这极大地提高了并发性能,因为相比于表级锁,行级锁只锁定涉及的数据行,而不是整个表...

    浅析MYSQL中的并发操作与锁定

    MYSQL中的锁定机制有三种级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking),BDB存储引擎采用的是页面锁(page-level locking),InnoDB存储引擎既支持行级锁(row-level ...

Global site tag (gtag.js) - Google Analytics