MySQL 并发控制(锁得使用)

摘要:
锁的实现MySQL是使用MVCC实现的。悲观锁乐观锁MVCC这种机制是通过对一行数据的几个隐藏列进行操作实现的。InnoDB和MyISAM最大区别InnoDB有行级锁和事务
导读

并发问题:同一时刻进行读写,并发问题回引发数据不一致问题。

解决并发问题:MySQL采用了锁定机制去解决并发问题

锁的分类

MySQL使用两种锁机制去解决问题:共享锁排他锁,也叫读锁或者写锁。

    • 共享锁、读锁:不影响其他连接的读,写会受影响
    • 排他锁、写锁:会不让其他连接进行读写

MySQL针对不同的数据粒度,又分别使用表锁行锁进行锁定。

锁的实现

MySQL是使用MVCC(Multi-Version Concurrency Control)实现的(性能很好,其实并没有真正上锁)。

    • 悲观锁(真正上锁)
    • 乐观锁(通过一些递增的字段来控制逻辑上锁)

MVCC这种机制是通过对一行数据的几个隐藏列进行操作实现的。

B+树的数据行,其实每一行都要加上几个隐藏列(版本号,一条记录可能对应几个版本号,差不多可以这样理解,一个版本号,对应一个快照)

服务层和存储引擎层

服务层只是实现了表锁:

加锁:lock table 表名 read(write),表名2 read(write)

解锁:unlock tables;

存储引擎层实现行锁(只有InnoDB和extraDB实现了行锁)

存储引擎层和服务器层可能都实现了行锁,但是实现逻辑不一样,优先使用存储引擎层的实现。

事务部分会隐式的去加行锁和表锁,其中这个表锁不是服务器层实现的表锁。

行锁和表锁对比

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

行级锁:开销大,加锁慢;回出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最大

MVCC并发控制,读操作分类

在MVCC并发控制中,读操作可以分成两类:快照读(snapshot read)与当前读(current read)

快照读,读取的记录的可见版本(有可能是历史版本),不用加锁。

当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。

快照读:简单的select操作,属于快照读,不加锁。

select * from table_name where ?;

当前读:特殊的操作,插入/更新/删除操作,属于当前读,需要加锁。

select * from table_name where ? lock in share mode;
select * from table_name where ? for update;
insert into table_name values (...);
update table_name set ? where ?;
delete from table_name where ?;

以上都属于当前读,读取记录的最新版本。并且读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加S锁(共享锁)外,其他的操作,都加的事X锁(排他锁)。

InnoDB和MyISAM最大区别

InnoDB有行级锁和事务

免责声明:文章转载自《MySQL 并发控制(锁得使用)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇修改bootstrap-table中的分页样式ACE_Task笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

day1_jmeter操作mysql步骤

在测试计划页面首先添加,点击浏览按钮找到jar包,打开即可,通过jar包连接mysql数据库右键线程组添加->配置原件->JDBC Connection Configuration,在Variable Name文本框里输入一个变量名,其余的按图中填写,Database URL那要包含连接的服务器IP、端口和数据库,也可以在数据库stu后面输入u...

mysql用root用户给其他用户授权报错1044 access denied for user root

公司本地测试数据库一直使用root直接使用数据库,一直使用没问题 突然有一天,需要增加一个用户,并使用该用户进行操作数据库 在成功创建新用户后,开始想给用户授予最高权限,结果报错,1044 access denied for user root 我以为是无法创建同样的root用户 于是建了一个新数据库,newdb ,单独个新建用户增加newdb的权限,还是...

mysql 视图

一、使用视图的理由是什么?1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。 2.查询性能提高。3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的。例子:假如因为某...

mysql驱动与数据库及jdk各版本对应关系

mysql驱动与jdk版本还有着一定的关系,经现场实测及搜索资料,记录如下: 应用JDK版本1.5  测试环境MySQL版本5.7 驱动版本5.1.40.jar  正常                             生产环境MySQL版本8.0 驱动版本5.1.40.jar  连接不上                             生产...

Mysql-锁

Mysql中默认的是MyISAM数据引擎,可惜此引擎不支持事务处理,我们需要将默认的数据引擎改为InnoDB。InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。 启动InnoDB引擎的方法如下: 1)关闭mysql的服务 2)修改my.ini 将default-storage-engine=INNODB前的注释(#)去掉 将skip-...

关系数据库和NoSQL结合使用:MySQL + MongoDB

Home Page作者使用一个案例来说明MySQL+MongoDB结合使用,发挥各自所长,并且认为他们互补性很强。当然,这其中不可避免引入DDD中的编程设计模式 Repository仓储模式,通过它能够将数据存储方式和应用分离开来,这样,我们的程序就不受限于任何存储方式,无论是NoSQL或关系数据库。这个案例是一个按效果付费Pay-for-use的分析案例...