mysql 锁2
官网地址
https://dev.mysql.com/doc/refman/5.5/en/innodb-transaction-isolation-levels.html
这里主要是说事务隔离级别,以及对锁的影响
Transaction isolation is one of the foundations of database processing. Isolation is the I in the acronym ACID; the isolation level is the setting that fine-tunes the balance between performance and reliability, consistency, and reproducibility of results when multiple transactions are making changes and performing queries at the same time.
InnoDB offers all four transaction isolation levels described by the SQL:1992 standard: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, and SERIALIZABLE. The default isolation level for InnoDB is REPEATABLE READ.
A user can change the isolation level for a single session or for all subsequent connections with the SET TRANSACTION statement. To set the server's default isolation level for all connections, use the --transaction-isolation option on the command line or in an option file. For detailed information about isolation levels and level-setting syntax, see Section 13.3.6, “SET TRANSACTION Syntax”.
InnoDB supports each of the transaction isolation levels described here using different locking strategies. You can enforce a high degree of consistency with the default REPEATABLE READ level, for operations on crucial data where ACID compliance is important. Or you can relax the consistency rules with READ COMMITTED or even READ UNCOMMITTED, in situations such as bulk reporting where precise consistency and repeatable results are less important than minimizing the amount of overhead for locking. SERIALIZABLE enforces even stricter rules than REPEATABLE READ, and is used mainly in specialized situations, such as with XA transactions and for troubleshooting issues with concurrency and deadlocks.
The following list describes how MySQL supports the different transaction levels. The list goes from the most commonly used level to the least used.
- REPEATABLE READ- This is the default isolation level for - InnoDB. Consistent reads within the same transaction read the snapshot established by the first read. This means that if you issue several plain (nonlocking)- SELECTstatements within the same transaction, these- SELECTstatements are consistent also with respect to each other. See Section 14.8.2.3, “Consistent Nonlocking Reads”.- For locking reads ( - SELECTwith- FOR UPDATEor- LOCK IN SHARE MODE),- UPDATE, and- DELETEstatements, locking depends on whether the statement uses a unique index with a unique search condition, or a range-type search condition.- For a unique index with a unique search condition, - InnoDBlocks only the index record found, not the gap before it.
- For other search conditions, - InnoDBlocks the index range scanned, using gap locks or next-key locks to block insertions by other sessions into the gaps covered by the range. For information about gap locks and next-key locks, see Section 14.8.1, “InnoDB Locking”.
 
- READ COMMITTED- Each consistent read, even within the same transaction, sets and reads its own fresh snapshot. For information about consistent reads, see Section 14.8.2.3, “Consistent Nonlocking Reads”. - For locking reads ( - SELECTwith- FOR UPDATEor- LOCK IN SHARE MODE),- UPDATEstatements, and- DELETEstatements,- InnoDBlocks only index records, not the gaps before them, and thus permits the free insertion of new records next to locked records. Gap locking is only used for foreign-key constraint checking and duplicate-key checking.- Because gap locking is disabled, phantom problems may occur, as other sessions can insert new rows into the gaps. For information about phantoms, see Section 14.8.4, “Phantom Rows”. - If you use - READ COMMITTED, you must use row-based binary logging.- Using - READ COMMITTEDhas additional effects:- For - UPDATEor- DELETEstatements,- InnoDBholds locks only for rows that it updates or deletes. Record locks for nonmatching rows are released after MySQL has evaluated the- WHEREcondition. This greatly reduces the probability of deadlocks, but they can still happen.
- For - UPDATEstatements, if a row is already locked,- InnoDBperforms a “semi-consistent” read, returning the latest committed version to MySQL so that MySQL can determine whether the row matches the- WHEREcondition of the- UPDATE. If the row matches (must be updated), MySQL reads the row again and this time- InnoDBeither locks it or waits for a lock on it.
 - Consider the following example, beginning with this table: - CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
 INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
 COMMIT;
In this case, table has no indexes, so searches and index scans use the hidden clustered index for record locking (see Section 14.11.2.1, “Clustered and Secondary Indexes”).
Suppose that one client performs an UPDATE using these statements:
SET autocommit = 0;
UPDATE t SET b = 5 WHERE b = 3;Suppose also that a second client performs an UPDATE by executing these statements following those of the first client:
SET autocommit = 0;
UPDATE t SET b = 4 WHERE b = 2;As InnoDB executes each UPDATE, it first acquires an exclusive lock for each row, and then determines whether to modify it. If InnoDB does not modify the row, it releases the lock. Otherwise, InnoDB retains the lock until the end of the transaction. This affects transaction processing as follows.
When using the default REPEATABLE READ isolation level, the first UPDATE acquires x-locks and does not release any of them:
x-lock(1,2); retain x-lock
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); retain x-lock
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); retain x-lockThe second UPDATE blocks as soon as it tries to acquire any locks (because first update has retained locks on all rows), and does not proceed until the first UPDATE commits or rolls back:
--comment: REPEATABLE-READ级别的情况下,由于所有记录没有索引,扫描所有记录的时候不管是否匹配条件,这些记录都被锁上
x-lock(1,2); block and wait for first UPDATE to commit or roll backIf READ COMMITTED is used instead, the first UPDATE acquires x-locks and releases those for rows that it does not modify:
--comment: 而在READ-COMMITTED级别的情况,同样会扫描所有记录并对所有记录上锁,但会对比匹配的记录解锁
x-lock(1,2); unlock(1,2)
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); unlock(3,2)
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); unlock(5,2)For the second UPDATE, InnoDB does a “semi-consistent” read, returning the latest committed version of each row to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE:
x-lock(1,2); update(1,2) to (1,4); retain x-lock
x-lock(2,3); unlock(2,3)
x-lock(3,2); update(3,2) to (3,4); retain x-lock
x-lock(4,3); unlock(4,3)
x-lock(5,2); update(5,2) to (5,4); retain x-lock- The effects of using the - READ COMMITTEDisolation level are the same as enabling the- innodb_locks_unsafe_for_binlogconfiguration option, with these exceptions:- Enabling - innodb_locks_unsafe_for_binlogis a global setting and affects all sessions, whereas the isolation level can be set globally for all sessions, or individually per session.
- innodb_locks_unsafe_for_binlogcan be set only at server startup, whereas the isolation level can be set at startup or changed at runtime.
 - READ COMMITTEDtherefore offers finer and more flexible control than- innodb_locks_unsafe_for_binlog.
- READ UNCOMMITTED- SELECTstatements are performed in a nonlocking fashion, but a possible earlier version of a row might be used. Thus, using this isolation level, such reads are not consistent. This is also called a “dirty read.” Otherwise, this isolation level works like- READ COMMITTED.
- SERIALIZABLE- This level is like - REPEATABLE READ, but- InnoDBimplicitly converts all plain- SELECTstatements to- SELECT ... LOCK IN SHARE MODEif- autocommitis disabled. If- autocommitis enabled, the- SELECTis its own transaction. It therefore is known to be read only and can be serialized if performed as a consistent (nonlocking) read and need not block for other transactions. (To force a plain- SELECTto block if other transactions have modified the selected rows, disable- autocommit.)
mysql 锁2的更多相关文章
- mysql锁
		锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ... 
- Mysql锁初步
		存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ... 
- mysql锁表机制及相关优化
		(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ... 
- MySQL锁系列3 MDL锁
		http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ... 
- 01 MySQL锁概述
		锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ... 
- Mysql锁机制介绍
		Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ... 
- MySQL锁等待分析【2】
		MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ... 
- MySQL锁与MVCC
		--MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ... 
- MySQL锁总结
		本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ... 
- Mysql锁机制--并发事务带来的更新丢失问题
		Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ... 
随机推荐
- 【EOJ Monthly 2018.7】【D数蝌蚪】
			https://acm.ecnu.edu.cn/contest/92/problem/D/ D. 数蝌蚪 Time limit per test: 2.0 seconds Memory limit: ... 
- Kubernetes学习
			DNS for Services and Pods Services 创建基本的Service kind: Service spec.clusterIP: 为一组相同的服务的Pod集群提供一个虚拟ip ... 
- Python基础线程和协程
			线程: 优点:共享内存,IO操作时,创造并发操作 缺点:枪战资源 线程不是越多越好,具体案例具体分析,请求上下文切换耗时 IO密集型适用于线程,IO操作打开文件网络通讯类,不需要占用CPU,只是由CP ... 
- Python基础-使用paramiko
			一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ... 
- Go Example--通道非阻塞
			package main import ( "fmt" ) func main() { messages := make(chan string) signals := make( ... 
- gtk_init()
			#include<stdio.h> #if 0int main(int argc, char *argv[]){ char ***p = &argv; //传参退化成二级指针,对二 ... 
- CONTINUOUS MIGRATION
			转自:https://pgloader.io/blog/continuous-migration/ After having been involved in many migration proje ... 
- ksonnet 一个简化编写以及部署kubernetes的工具
			ksonnet 是一个基于jsonnet的快速简化kubernetes yaml 配置的工具,可以实现配置的复用 同时也包含一个registry 的概念,可以实现可复用组件的分发,同时支持helm 环 ... 
- MySQL中视图
			视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用 ... 
- SqlDependency和SqlCacheDependency缓存的用法及具体步骤
			SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决什么问题? Asp.Net中的cac ... 
