专栏首页WD学习记录MySQL事务与乐观锁

MySQL事务与乐观锁

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/sxllllwd/article/details/102892055

最近感觉自己好像干了一件蠢事,写了一个事务包含A和B两个操作,然后又在A中加了乐观锁,导致失败率特别高。因此重新看了事务与乐观锁的资料。

一次封锁 两段锁

一次封锁法,就是方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。可以有效避免循环死锁。

两段锁协议

加锁阶段和解锁阶段。

加锁阶段:在任何数据进行读操作之前都有申请获得S锁,在进行写操作之前要申请并获得X锁,加锁不成功,则事务进入等待状态,直到加锁成功才继续。

解锁阶段:当事务释放了一个封锁之后,事务进入解锁阶段,在该阶段只能进行解锁操作而不能再加锁。

两段锁协议可以保证事务的并发调度串行化(串行化很重要,尤其是在数据恢复和备份的时候),但是无法避免死锁。

Update加行锁

如果update更新的where语句中的筛选条件没有索引,会导致MYSQL给整张表的所有数据加行锁。在SQL运行过程中,mysql并不知道哪些数据行是符合where条件的(没有索引)。如果一个条件无法通过索引快速过滤,存储引擎层面就会将所有记录加锁后返回,再由MYSQL层进行过滤。

但是实际使用过程中,mysql做了一些改进,在MYSQL过滤条件,发现不满足之后,会调用unlock_row方法,把不满足条件的纪录释放锁(违背了二段锁协议的约束)。这样做,保证了最后只会持有满足条件纪录上的锁。但是每条记录的加锁操作还是不能省略的。

这种情况同样适用于MYSQL的默认隔离级别可重复读。对一个数据量很大的表做批量修改的时候,如果无法使用相应的索引,MYSQL 过滤数据的时候特别慢,就会出现虽然没有修改某些行的数据,但是它们还是被锁住了。

快照读与当前读

快照读很可能读取的是历史数据,而不是数据库当前数据。

在MVCC中:

  • 快照读:就是select
    • select * from table ….;
  • 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。
    • select * from table where ? lock in share mode;
    • select * from table where ? for update;
    • insert;
    • update ;
    • delete;

Next-Key锁

行锁防止别的事务修改或删除,GAP锁防止别的事务新增,行锁和GAP锁结合形成的的Next-Key锁共同解决了RR级别在写数据时的幻读问题。

参考文档:

Innodb中的事务隔离级别和锁的关系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货满满--亲身经历的 Python 面试题

    如果看过我第一篇文章(三个月自学拿到 python 开发 offer!)的朋友可能知道,我来上海一个多星期,面试了大概十几家公司,收到了一些 offer,其实截...

    Rocky0429
  • NAR| 表观组关联分析数据库 - EWAS Data Hub

    近年来, 表观组关联分析(Epigenome-wide Association Study,EWAS)已成为探索复杂性状表观遗传基础的有效策略。随着大量EWAS...

    生信宝典
  • 面试官:为什么 MySQL 索引要使用 B+树而不是其它树形结构?比如 B 树?

    https://www.cnblogs.com/leefreeman/p/8315844.html?from=singlemessage&isappinstal...

    哲洛不闹
  • 告别慢SQL,如何去写一手好SQL ?

    链接 | cnblogs.com/xiaoyangjia/p/11267191.html

    Java技术江湖
  • 听说你还不会将数据存入文件?

    在前面的文章中,我们学过用 Python 如何读写文件。程序执行结果,就是产生一些数据,一般情况下,这些数据要保存到磁盘中,最简单的方法就是写入到某个文件。但是...

    Rocky0429
  • Python 操作 MySQL 数据库(上)

    在昨天的文章(听说你还不会将数据存入文件?)中我们学习用文件形式将数据保存到磁盘中,虽然这已经是一种不错的方式,但是头秃的大佬们还是发明了更快更便捷的东西:「数...

    Rocky0429
  • NAR |非编码RNA相互作用数据库NPInter v4.0

    2019年10月31日,Nucleic Acids Research在线发表了中科院生物物理所健康大数据研究中心题目为“NPInter v4.0: An int...

    生信宝典
  • MySQL是怎么保证数据一致性的

    在《写数据库同时发mq消息事务一致性的一种解决方案》一文的方案中把分布式事务巧妙转成了数据库事务。我们都知道关系型数据库事务能保证数据一致性,那数据库到底是怎么...

    普通程序员
  • 你的数据也可以-两篇NAR的数据库

    生物信息分析离不开数据资源和数据库,生物信息学数据库分类概览 (第一版)系统梳理了常用功能数据库。

    生信宝典
  • SQL易错锦集

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    chenchenchen

扫码关注云+社区

领取腾讯云代金券