MySql的乐观锁,悲观锁怎么实现的

warning: 这篇文章距离上次修改已过256天,其中的内容可能已经有所变动。

乐观锁

    乐观锁大多是基于数据版本(version)的记录机制实现。何为数据版本?增加一个版本标识,在基于数据库表的解决方案中,一般是通过未数据库表增加一个version,在读取数据时,将版本号一起读出,之后更新时,对此版本号+1。

    此时将提交的版本数据与数据库表中对应记录的当前版本信息进行比对,如果提交的数据版本信息大于当前数据版本信息,则予以更新,否则认为是过期数据。

    优点:乐观锁机制避免了长事务中的数据库加锁开销(操作员A和操作员B操作过程中,都没对数据库数据加锁),大大提升了大并发量下的系统整体性能表现

实现方式:两种方式

1、加一个字段 数据版本(version)记录机制

2、加一个字段用时间戳代替版本
使用场景:

    高并发读取数据环境:当应用程序需要进行大量读取操作时,使用乐观锁可以提交系统性能和吞吐量。乐观锁在在大多数情况下不会锁定资源,减少了性能丢失;

    数据一致性的保障:尽管乐观锁减少对资源的锁定,但他们仍然可以提供一定的数据一致性保护。如果多个数据同时读取同一数据,并进行修改,乐观锁能够保证只有最终成功更新的线程才能继续执行后续操作

    避免长事务等待:如果程序使用了悲观锁,那么每个读取操作都需要先获得锁,这回导致长事务等待时间增加

注意:

乐观锁可以减少对资源的锁定,但在面对大量写入操作的情况下,数据冲突的可能性增大,这时可能需要更多的查询操作来重新获取数据以保持一致性
悲观锁
实现方式:

悲观锁是指在对数据进行操作之前,先加锁,保证在操作期间不会有其他用户修改改数据。

行级锁:在对某一行进行操作时,先获取该行的锁,其他用户需要等待该行锁的释放才能操作

表级锁:在对整个表进行操作时,先获取整个表的锁,其他用户需要等待整个表锁的释放才能进行操作

使用场景:

适用于频繁对数据修改和更新的场景,例如银行转账,订单处理

注:悲观锁用之前考虑清楚

0

版权声明 ▶ 本网站名称:我的学习笔记
▶ 本文链接:https://ooolo.net/article/437.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!!

none
最后修改于:2024年04月02日 10:46

添加新评论

icon_mrgreen.pngicon_neutral.pngicon_twisted.pngicon_arrow.pngicon_eek.pngicon_smile.pngicon_confused.pngicon_cool.pngicon_evil.pngicon_biggrin.pngicon_idea.pngicon_redface.pngicon_razz.pngicon_rolleyes.pngicon_wink.pngicon_cry.pngicon_surprised.pngicon_lol.pngicon_mad.pngicon_sad.pngicon_exclaim.pngicon_question.png