MySQL学习记录—什么是锁

目录

 

悲观锁和乐观锁

悲观锁

乐观锁

MySQL中的锁

按锁的粒度分类

按锁是否可写分类


悲观锁和乐观锁

悲观锁

悲观锁由名字可知,就是把各种东西看的很消极悲观。比如在获取数据处理的时候,担心自己处理的过程中有人会修改这条数据,那么就把数据加锁(表锁、行锁等等)。那么这时其他线程操作数据就会处于阻塞状态,直到该线程操作完毕。

乐观锁

乐观锁就是在对数据库操作过程中,认为外界是不会对数据库操作造成冲突的。那么就不会对数据加任何形式的锁,而是在提交更新的时候,才会对数据进行冲突检测。乐观锁主要是采用了CAS的思想,之后会单独开一篇说这个以及ABBA问题。

MySQL中的锁

InnoDB存储引擎支持行锁和表锁,但其他像MyISAM、MEMORY等只支持表锁,所以以下针对于InnoDB引擎展开。

按锁的粒度分类

  • 表锁,表级锁是对某个表执行DDL语句的同时其他事务执行DML语句会发生阻塞
  • 行锁,行锁是面试中的重头戏。顾名思义就是在某行记录上加锁,行锁又主要有以下三种

Record Locks

对索引项加锁,锁定复合条件的行加锁

Gap Locks

对范围加锁,即索引项的间隙加锁。gap锁主要是用来解决幻读问题的,因为记录还不存在的时候是没有索引记录的,那固然是不能给索引加锁的。

Next-Key Locks

锁定索引项本身和索引范围,该锁其实是前两种锁的合体。它既能保护该条记录,又能阻止别的事务将新记录插入被保护记录前边的间隙

按锁是否可写分类

  • 共享锁(读锁,简称S锁),在事务读取一条记录时,需要先获取该记录的S锁。假设事务T1获取到S锁后,其他事务比如T2也可以获取S锁,但无法获取X锁。
  • 排它锁(写锁,简称X锁),在事务要变更记录的时候,需要先获取该记录的X锁。假设事务T1获取到X锁后,其他事务比如T2只能等T1提交事务释放后才能获取。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中实现分布式可以通过以下几种方式: 1. 基于MySQL自带的行实现 可以通过在表中添加一条记录来实现分布式。当一个客户端想获取时,可以向表中插入一条记录,如果插入成功则说明获取成功,否则获取失败。当客户端释放时,可以删除表中对应的记录。需要注意的是,由于MySQL自带的行只在当前连接中有效,因此需要在每个客户端中都执行相同的加和解操作。 2. 基于MySQL的GET_LOCK和RELEASE_LOCK函数实现 MySQL提供了GET_LOCK和RELEASE_LOCK两个函数,可以用于实现分布式。当一个客户端想获取时,可以调用GET_LOCK函数,如果返回值为1则说明获取成功,否则获取失败。当客户端释放时,可以调用RELEASE_LOCK函数来释放。需要注意的是,由于GET_LOCK和RELEASE_LOCK函数是在MySQL服务器端执行的,因此可以实现跨连接的。 3. 基于ZooKeeper实现 可以利用ZooKeeper的临时节点来实现分布式。当一个客户端想获取时,可以在ZooKeeper上创建一个临时节点,如果创建成功则说明获取成功,否则获取失败。当客户端释放时,可以删除对应的临时节点。由于ZooKeeper是一个高可用的分布式协调服务,因此可以保证分布式的可靠性和高可用性。 以上是几种实现MySQL分布式的方式,需要根据具体的应用场景和实际需求选择合适的方式实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值