剑指Offer(SQL)—— MyISAM和InnoDB关于锁方面的区别

MyISAM默认使用的是表级锁,不支持行级锁

当我们操作的表使用的是MyISAM引擎,这个时候我们对同一张表进行查询操作的时候,需要十秒那么再在这十秒内其他的SQL语句要想对这张表进行写操作的话就会被阻塞,一直要等到这十秒结束才能去进行操作。
这样的锁叫做共享锁。

在MyISAM引擎中在查询语句执行过程中,不会影响其他用户对于表的查询,但在查询过程中不能对表进行写操作。

并且也不只是有读才有共享锁(读锁),MyISAM进行写操作的时候会生成排它锁(写锁)。

排它锁(写锁)就是说当在对一张MyISAM引擎表进行写操作的同时无法对表进行任何其他的操作,直到写操作结束之后才能执行。

对表加了共享锁之后还可以加共享锁但是不能加排它锁。

InnoDB默认用的是行级锁,也支持表级锁

InnoDB引擎是支持事务的,通过session暂时取消自动提交方式模拟并发访问的过程。

下面发生的情况都是基于不自动提交的情况(set autocommit = 0即可把当前session的自动提交取消),取消自动提交之后就需要手动进行加锁,如果不取消自动提交的话,SQL默认自动执行begin/start transaction和commit去开启和关闭事务。

InnoDB内部加锁默认是二段锁,就是说分为加锁和解锁的过程。在开启事务之前统一进行加锁,加锁方式就是lock in share mode为手动加共享锁,for update是手动加排它锁,commit之后统一进行解锁。

如select * from < tableName> where id = 1 lock in share mode这样就是对这一行加了读锁,只要不执行commit那么这行就会被一直锁下去,其他语句只能对这一行进行读(加共享锁),无法加排它锁。

select * from < tableName> where id = 1 for update会自动加上排它锁,前提是这一行没有加过共享锁,道理和MyISAM一样,直到执行commit之后锁才会被释放。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值