mysql笔记(六)--锁

文章目录

(一) mysql笔记–基本概念
(二) mysql笔记–基本操作
(三) mysql笔记–事务
(四) mysql笔记–索引
(五) mysql笔记–其他操作
(六) mysql笔记–锁

1. 读写锁

  • 读锁会阻塞写,但不会阻塞读
  • 写锁会阻塞读和写

2. 行页表锁

  • 对表中的记录加锁,叫做记录锁,又称行锁,行锁只锁定一行,偏写
  • 表锁会锁定整个表,偏读
  • 页锁在行锁和表锁之间

3. InnoDB自动加锁

  • 对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及及数据集加排他锁
  • 对于普通SELECT语句,InnoDB不会加任何锁
  • 事务可以通过以下语句显示给记录集加共享锁或排锁。

//共享锁(S)
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
//排他锁(X)
SELECT * FROM table_name WHERE ... FOR UPDATE

4. 乐观锁和悲观锁

  • 悲观锁
        先获取锁,再进行业务操作,悲观的认为所有的操作均会导致并发安全问题,因此要先确保获取锁成功再进行业务操作。select … for update 实现悲观锁
  • 乐观锁
        先进行业务操作,再获取锁,一般的做法是在需要锁的数据上增加一个版本号,或者时间戳,提交更新时,时间戳或版本号必须大于当前版本才提交更新

SELECT data AS old_data, version AS old_version FROM;
//根据获取的数据进行业务操作,得到new_data和new_version
UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
    // 乐观锁获取成功,操作完成
} else {
    // 乐观锁获取失败,回滚并重试
}

  • 使用场景
        一般情况下,读多写少更适合用乐观锁,读少写多更适合用悲观锁。乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能。

5. 间隙锁

  • 当我们使用范围条件而不是相等条件查询数据时,InnoDB会把符合条件的数据记录索引项都加锁,此时键值在条件范围内,但并不存在的数据记录称为间隙。比如检索1-3之间的数据,但表中并没有数据2,此时InnoDB会对这个间隙也加锁,若范围检索不提交,另一个对间隙进行操作(比如添加2)会被阻塞,无法插入数据,导致性能变差, 使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待

  • 间隙锁的主要作用是为了防止出现幻读

  • 修改系统参数innodb_locks_unsafe_for_binlog=on就可以关闭改间隙锁机制,该值默认为off,修改事务隔离级别为read-committed也可以避免间隙锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值