mysql 并发控制
1、多个线程同时修改数据,存在数据不一致的情况,也就是并发控制的问题。
2、mysql提供读锁和写锁,读锁之上可以再加读锁,不能加写锁,而写锁之上不能加任何锁。也就是说,读锁是共享的,写锁是排他的。
3、锁粒度,为了更好的并发控制,锁的粒度应该尽可能小,也就是只锁定修改的数据。但是,锁本身也有一定的开销,包括获取锁,检查锁是否释放,释放锁,这些操作也耗费一定的资源。锁的粒度小,在并发控制的时候,也就意味着需要更多的锁,锁的总开销也就越大。
4、根据锁的粒度,分为表锁和行锁,mysql本身使用表锁来实现不同的目的,比如alter table,这个时候会忽略存储引擎的锁机制。存储引擎支持表锁和行锁,不同存储引擎的实现不同。
5、特别注意:mysql支持不同的事务隔离级别,隔离级别越高,锁的粒度越大,也就是锁的内容越多。比如:
考虑下面的情况,A,B客户端的事务隔离级别都是read-uncommitted, 锁的粒度是行锁。
步骤一、A执行start transaction,修改一条记录
步骤二、B执行start transaction,修改另一条记录
二者是不阻塞的,证明read-uncommitted 是行锁。同理,可以证明read-committed是行锁,repeatable-read和serializable是表锁。
注意:加什么锁,锁多大范围,和很多因素有关,包括是否有索引,执行的操作等。比如上面的情况,A、B都是repeatable-read,A进行select,B进行update不阻塞。但是A进行update,B进行update就会阻塞。
6、死锁,mysql在事务中,InnoDB会根据事务隔离级别自动锁定,而释放实在事务commit或者rollback的时候才释放。这就会存在死锁的情况,考虑下面的情况:
A,B客户端的事务隔离级别都是read-uncommitted, 锁的粒度是行锁。
步骤一、A执行start transaction,修改记录1
步骤二、B执行start transaction,修改记录2
步骤三、A修改记录2
步骤四、B修改记录1
出现死锁,不过mysql功能很强大,可以检测出这种死锁,B修改记录1的时候报错 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting trans
action
mysql 并发控制的更多相关文章
- 五分钟详解MySQL并发控制及事务原理
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...
- mysql并发控制之快照读和当前读
上一篇简单的介绍了下MVCC(多版本并发控制)的原理,MVCC会对事物内操作的数据做多版本控制,从而实现并发环境下事物对数据写操作的阻塞不影响读操作的性能.而这个多版本控制的实现是由undo log来 ...
- mysql并发控制之MVCC
1.MVCC(Multiversion concurrency control) :多版本并发控制,当我们并发访问数据库(读或写)时,对事物内正在处理的数据做多版本控制,用以防止写操作的阻塞影响读操作 ...
- MySQL并发控制
并发即指在同一时刻,多个操作并行执行.MySQL对并发的处理主要应用了两种机制——是“锁”和“多版本控制”. 锁 锁分为读锁和写锁两种,也称作共享锁和排他锁.因为多个读操作同时进行是不会破坏数据的,所 ...
- MySQL——并发控制(锁)
核心知识点: 1.表锁和行级锁代表着锁的级别:读锁和写锁代表锁定真实类型. 2.读锁属于共享锁,共享同一资源,互不干扰:写锁属于排他锁,为了安全起见,写锁会阻塞其他的读锁和写锁. 3.表锁的开销最小, ...
- mysql并发控制之数据库锁
1.mysql和redis的区别 mysql是一种关系型数据库,数据会最终存储在磁盘上.而redis是一种非关系型的nosql数据库,以key-value的形式存储数据,将数据存储在内存.从性能上来说 ...
- mysql—并发控制及事务
并发控制 实现的并发访问的控制技术是基于锁: 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁:InnoDB支持表级锁和行级锁: 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可 ...
- 深入理解MySQL的并发控制、锁和事务【转】
本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom read ...
- 深入理解Mysql——锁、事务与并发控制
本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...
随机推荐
- javaScript数组循环删除
遍历数组循环的时候,限定条件不要写arr.length,因为数组的长度会随着删除元素的同时减小. 例如,一个原本长度为10的数组,如果采用 for(var i = 0; i< arr.lengt ...
- c# 反射列子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- js九九乘法表
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- 附加数据库对于服务器失败(Microsoft.SqlServer.Smo),无法升级数据库,因为它是只读的,或者具有只读文件
今天在将一个 SQL Server 2000 数据库附加到 SQL Server 2005时出现如下的错误:附加数据库对于服务器失败(Microsoft.SqlServer.Smo),无法升级数据库t ...
- tomcat异常: Cannot get a connection, pool exhausted
1 问题描述Web程序在tomcat刚开始运行时速度很快,但过一段时间后发现速度变得很慢. 检查日志输出,发现异常如下:org.apache.commons.dbcp.SQLNestedExcepti ...
- (6)redis 事务
redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所 ...
- Spring.Net 技术简介 IOC and DI
一 简单介绍 IOC 控制转移,就是将创建放到容器里,从而达到接耦合的目的,DI是 在容器创建对象的时候,DI读取配置文件,然后给对象赋默认值,两者一般结合使用,实现注入. ...
- TCP、UDP
双方都是一种网络传输协议 2.TCP需要建立连接,而UDP不需要建立连接(无连接传输) 3.是否建立真实连接的特性,造成了双方可靠性的差距. TCP属于可靠的传输协议:因为传输前双方建立好了连接,相当 ...
- duilib -- Label控件的bug(转载)
转载:http://blog.csdn.net/rundll64/article/details/24823809?locationNum=6&fps=1 发现LabelUI的[属性列表.XM ...
- visual studio运行时库MT、MTd、MD、MDd的研究(转载)
转载:http://blog.csdn.net/ybxuwei/article/details/9095067 转载:http://blog.sina.com.cn/s/blog_624485f701 ...