2019-03-13

悲观锁、乐观锁

悲观锁:在查询的时候,锁起来,事务结束后,释放。

悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select… for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁:查询的时候,不需要操作,更改的时候再判断。

乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。

使用python代码实现增删改查。




查看所有

查看单个



©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、整理今天所学的知识点 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 1.主从复...
    世界如此美妙_32e2阅读 2,224评论 0 0
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 6,655评论 0 5
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,790评论 0 9
  • 蛋糕也是一样,网红蛋糕的意义在于拍照,毕竟谁都不差一口蛋糕的年代,怎么吸引顾客购买,大概还是漂亮比较重要。美到一定...
    撸熄阅读 4,776评论 0 4
  • 1、我们都需要一面“照妖镜” 今年5月23日的晚上,我在上海参加了人生中的第一次磨课。当时,任博老师有一句话让我印...
    小说家郭大侠阅读 3,229评论 0 3