MySQL乐观锁和悲观锁如何实现


这篇文章主要介绍了MySQL乐观锁和悲观锁如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL乐观锁和悲观锁如何实现文章都会有所收获,下面我们一起来看看吧。 MySQL的中锁按照范围主要分为表锁、行锁和页面锁。其中myisam存储引擎只支持表锁,InnoDB不仅仅支持行锁,在一定程度上也支持表锁。按照行为可以分为共享锁(读锁)、排他锁(写锁)和意向锁。按照思想分为乐观锁和悲观锁。下面的SQL语句是表的结构:插入模拟数据表中数据。悲观锁,比较消极的一种锁处理方式。直接在操作数据时,抢占锁。其他的事务在进行时就会等待,直到占有锁的事务释放锁为止。这种处理方式能保证数据的最大一致性,但是容易导致锁超时、并发程度低等问题。 首先我们开启事务一,并且对id=1的数据进行update操作,此时我们不提交事务。接着我们开启事务二,对id=1的数据进行update操作,查看此时会发生什么情况?我们执行完update语句之后,就处于等待状态,SQL语句也不会马上被执行,这是因为事务一没有commit,也就没有释放id=1的数据对应的写锁。效果如下图:乐观锁认为数据一般情况下不会造成冲突,只有当数据去执行修改情况时,才会针对数据冲突做处理。这里是如何发现冲突了呢?常规的方式,都是在数据行上加一个版本号或者时间戳等字段。(本文使用version作为版本好方式,使用时间戳方式同理)乐观锁的实现原理:一个事务在读取数据时,将对应的版本号字段读取出来,假设此时的版本号是1。另外一个事务也是执行同样的读取操作。当事务一提交时,对版本号执行+1,此时该数据行的版本号就是2。第二个事务执行修改操作时,针对业务数据做条件,并默认增加一个版本号作为where条件。此时修改语句中的版本号字段是不满足where条件,该事务执行失败。通过这种方式来达到锁的功能。客户端一:执行update语句的顺序应该在客户端二执行了select之后,在执行。客户端二:此时根据update返回的结构,可以看出受影响的行数为0,同时select查询之后,返现数据也是事务一的数据。悲观锁:比较适合写入云主机域名免费试用操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。关于“MySQL乐观锁和悲观锁如何实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MySQL乐观锁和悲观锁如何实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注开发云行业资讯频道。

相关推荐: mysql的日志文件是什么

本篇内容介绍了“mysql的日志文件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! mysql有四种日志文件:1、二进制日志文件,该日志文件会以二进制的形…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/23 10:10
下一篇 04/23 10:11

相关推荐