前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >悲观锁和乐观锁

悲观锁和乐观锁

作者头像
actionzhang
发布2022-11-30 17:04:46
3200
发布2022-11-30 17:04:46
举报

          前几天有人问了我一个问题,说如果数据库某些操作不用事务,那么又需要保持数据的一致性,那么该用什么方法替代事务。我就想到了悲观锁和乐观锁的思想,下面我解释一下在数据库中的悲观锁和乐观锁

        1.悲观锁就是把数据库的一些操作,放在事务当中,依赖数据库的隔离级别,实现对数据修改的封锁,这样做数据一致性可以保持的很好,但是效率比较低下,悲观锁从程序的角度上将,就是不在应用程序中做任何保证数据一致性操作,而是把操作放在事务中,把保证数据一致性的任务,交给数据库去做,也就是依赖数据库的锁机制。

        2.乐观锁其实从真正意义上并不是锁,是一种代替事务的操作,在应用程序中,如果一个事务不是太复杂,又能容忍数据的更新失败,并且可以尝试重复更新,那么可以考虑用乐观锁来替代事务,即不通过事务来保证数据的一致性,而是通过在程序中的一些操作来保证数据的一致性,防止丢失更新,我们解决的方法就是在数据表中增加一个版本号的字段,版本号可以用整数来做,如果实时性要求不高的话,还可以用时间戳做为版本号,就是每份数据都会维护自己的一个数据版本号,如果更新数据的时候发现数据库中的版本小于我们自己数据的版本,那么就证明数据库中的数据没有我们自己的数据新,那么更新数据库中的版本号为最新的版本号;如果更新数据的时候发现数据库中的版本大于等于我们自己数据的版本就证明,我们自己的数据已经过时,所以返回给程序更新失败的信息,那么我们可以增加版本号的值,如使用时间戳,再一次去尝试更新数据。

      悲观锁与乐观锁的区别:

         悲观锁是一种排他锁,效率低下,但是数据安全,一般实现在数据库中,不是实现在应用程序中,乐观锁准备说不是一种锁机制,它是应用程序自己加的一种保证数据一致性的机制,所以一般实现在应用程序中,而不是实现在数据库中,并且在hibernate中我们可以显示配置悲观锁乐观锁,当然乐观锁需要在配置文件中配置version属性(用来充当版本号)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档