前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL索引底层(三)--InnoDB中的锁

MySQL索引底层(三)--InnoDB中的锁

作者头像
用户7386338
发布2020-05-29 15:30:10
5110
发布2020-05-29 15:30:10
举报
文章被收录于专栏:Java患者Java患者

行锁,表锁

InnoDB存储引擎中有行锁以及表锁,行锁是InnoDB中默认的锁。

表锁:对整张表进行加锁,在同一时刻整张表的所有记录都被锁住。

行锁:只对表中的某一行记录进行加锁,表的其余行不会被占用,但是可能会出现死锁。

关闭事务自动提交

查看一下表数据

接着我们更新一条数据

执行成功之后我们并没有提交事务,这个时候这一条记录已经是加了锁的,所以我们在另外一个客户端更新同样的行记录。

自然就报错了,直接就等待超时了。这里证明已经加锁了,接着我们来证明是行锁还是表锁。

当我们执行update的时候,是update 字段a=1的 所以我们在update字段a=2的时候,虽然没有提交事务但是还是可以执行的,这里证明了InnoDB是行锁的。

注意:行锁必须有索引才能实现,否则就会自动锁住全表,也就是表锁,而InnoDB当有主键的时候,自动就会创建主键索引。

行锁与表锁的区别

行锁

优点 :粒度小, 因为加锁的只是一行数据。

缺点 :获取、释放所需要做的工作更多,并且容易发生死锁。

锁的优化:

合理设计索引

减少基于范围的数据检索过滤条件

尽量控制事务的大小,尽量使用较低的事务隔离级别

尽可能让所有的数据检索都通过索引来完成。

表锁

优点:获取跟释放快,能避免死锁(当执行update语句的时候,把整个表锁住了,其他的sql无法执行,所以不会造成死锁)

缺点:粒度太大,并发不够高,当并发量较多的时候,锁表会让进程无法继续执行sql。

死锁

死锁出现在行锁中,假设现在有一个T1的session线程去update一个数据库表table1 ,而且有一个T2的session线程去update一个数据库表table2。

在没有提交事务的时候,table1跟table2都已经进行了加锁,这个时候,T1去操作了table2,那么这个时候因为table2的记录加了锁,那么T1会一直在等待,接着T2又同样的去操作table1的表记录,也同样在等待,就造成了死锁

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 行锁与表锁的区别
    • 行锁
    • 表锁
    • 死锁
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档