MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
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中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...
MySQL数据库在处理并发操作时,为了保证数据的一致性和完整性,使用了不同的锁机制,包括行级锁、表级锁和页级锁。这三种锁的粒度不同,各有优缺点,适用于不同的场景。 行级锁是MySQL中最细粒度的锁,仅锁定操作的...
在多用户环境中,为了保证数据的一致性和完整性,MySQL 提供了多种锁定机制,包括全局锁、表级锁和行级锁。这些锁机制是数据库事务处理中的核心组成部分,下面我们将详细探讨这些锁的特性和应用场景。 1. **全局锁...
页级:引擎 BDB。表级:引擎 MyISAM , 理解为锁住整个表,可以同时...MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。对WRITE,MySQL使用的表锁定方法原理如下:如果在表
FOR UPDATE`,在Java中,synchronized关键字和ReentrantLock的lock()方法都是悲观锁的例子。 3. **分布式锁**:在分布式系统中,由于进程间的内存不可见,需要一种跨节点的协调机制来实现锁。常见的分布式锁实现有...
MySQL InnoDB 默认使用行级锁(Row-Level Lock),但在某些情况下可能会使用表级锁(Table Lock)。 - **行级锁(Row-Level Lock)**:当SQL语句中明确指定了主键或唯一索引时,MySQL将执行行级锁,只锁定被选取的...
MySQL的锁分为表级锁、页级锁与行级锁。表级锁是MySQL中粒度大的一种锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。常使用的MYISAM与INNODB都支持表级锁定。 表级锁定分为两类,读锁与写锁。读锁是预期...
在这种情况下,即使使用`FOR UPDATE`或`LOCK IN SHARE MODE`,InnoDB也可能升级为表级锁定,以确保数据的一致性。在这个示例中,窗口1试图通过`name`字段锁定行,由于`name`字段没有索引,可能导致整个表被锁定,...
MySQL的InnoDB存储引擎支持事务处理,并且具备行级锁机制,这使得它在处理并发事务时具有较高的效率。行级锁分为共享锁(Read Lock)和排他锁(Write Lock),这两种锁的设计是为了实现并发读写操作。 共享锁,也...
综上所述,锁机制是实现多用户并发访问的基石,无论是MyISAM表的表级锁还是InnoDB表的行级锁,都有其独特的应用场景和特点。了解并掌握这些锁机制,对于优化数据库性能、提高数据一致性具有重要意义。
7. **页级锁**:介于表级锁和行级锁之间,锁定的数据量比行级锁多,但比表级锁少,某些存储引擎支持页级锁。 在实际应用中,选择合适的锁类型和粒度是保证数据库并发性能的关键。例如,选择行级锁可以提高并发,但...
MySQL支持三种级别的锁:行级锁、页级锁和表级锁。其中,MyISAM存储引擎使用的是表级锁,而InnoDB则采用行级锁和表级锁,同时支持页级锁。 **1. 表级锁:** 表级锁是开销最小、加锁速度快的选择,但它的锁定粒度大...
MySQL 中有三种锁的级别:页级、表级、行级。每种锁级别都有其典型的引擎,页级的典型代表引擎为 BDB,表级的典型代表引擎为 MyISAM、MEMORY 以及很久以前的 ISAM,行级的典型代表引擎为 INNODB。 行级锁是 MySQL ...
MySQL数据库提供了多种锁机制来确保数据的一致性和完整性,主要分为两大类:行级锁和表级锁。 1. **行级锁**:这种类型的锁只锁定操作的数据行,允许其他事务在同一表的不同行上进行操作,提高了并发性。MySQL中的...
- InnoDB与MyISAM存储引擎的区别:InnoDB支持行级锁和事务,而MyISAM主要支持表级锁。 在使用过程中,应该根据实际的应用场景和性能需求,合理选择存储引擎和锁策略,以达到最优的并发控制效果。对于可能出现的锁争...
- InnoDB 支持行级锁和表级锁,默认使用行级锁。 - MyISAM 使用表级锁。 - BDB 使用页面锁,也可用表级锁。 二、行锁 行级锁分为共享锁(读锁)和排他锁(写锁): A. 共享锁: - 允许读取数据,但不允许修改...
在实际操作中,锁的粒度也是一个重要的概念,它可以是表级、页级、行级甚至更细粒度的锁。MySQL的InnoDB存储引擎支持行级锁定,这极大地提高了并发性能,因为相比于表级锁,行级锁只锁定涉及的数据行,而不是整个表...
MYSQL中的锁定机制有三种级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking),BDB存储引擎采用的是页面锁(page-level locking),InnoDB存储引擎既支持行级锁(row-level ...