博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 中的悲观锁和乐观锁的实现
阅读量:6837 次
发布时间:2019-06-26

本文共 865 字,大约阅读时间需要 2 分钟。

一、定义

1.悲观锁:即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录锁掉,这样别人就没法改这条数据了,一直到你的锁释放。

2.乐观锁:即很乐观,查询数据的时候总觉得不会有人更改数据,等到更新的时候再判断这个数据有没有被人更改,有人更改了则本次更新失败。

 

 

二、实现过程

 

2.悲观锁:悲观锁的实现采用的数据库内部的锁机制,一个典型的倚赖数据库的悲观锁调用:

select * from account where name=”张三” for update

  这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。也就是我们可以在查询数据的时候先用for update把这条数据锁住,然后更改完这条数据再提交。这样别的线程没法更新这条数据,也就保证了不会丢失更新。

2.1.悲观锁带来的性能问题。我们试想一个场景:如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果?所以我们这个时候可以使用乐观锁。

 

 

1.乐观锁:乐观锁的实现可以通过在表里面加一个版本号的形式,下面是一个实例。

讲解:也就是每个人更新的时候都会判断当前的版本号是否跟我查询出来得到的版本号是否一致,不一致就更新失败,一致就更新这条记录并更改版本号。

 

二、使用场景

像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,

上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适

转载于:https://www.cnblogs.com/zhaoyan001/p/8349547.html

你可能感兴趣的文章
程序员常去的103个网站
查看>>
联想的amd电脑,Debian8.8开机后亮度值始终最大,尝试过各种方法,始终无法解决,最后debian8.8在安装开源驱动后,成功调节...
查看>>
debian8修改kde桌面语言
查看>>
PHP对于数据库的基本操作——更新数据
查看>>
How HashMap works in Java
查看>>
洛谷P2057 善意的投票
查看>>
UVa11401 Triangle Counting
查看>>
MongoDB
查看>>
深入Android 【三】 —— 组件入门
查看>>
Matlab DIP(瓦)ch11表示与描述练习
查看>>
【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
查看>>
16、SpringBoot-CRUD错误处理机制(3)
查看>>
7、NIO--字符集Charset
查看>>
2-JSF html标签
查看>>
队列queue 代码
查看>>
Python-mysql 权限 pymysql 注入共计
查看>>
HashSet、LinkedHashSet、TreeSet
查看>>
ios 远程推送
查看>>
halcon算子翻译——compose5
查看>>
安装office2010提示要安装MSXML6.10.1129.0解决方法
查看>>