悲观锁和乐观锁的区别和应用场景
1.早上提醒项目提前上线下午两点至三点
2.导出两张模板,生产环境需要导出CSR一张表方便以后查看
3.这问题让我联系很多情景下应用的锁,分布式锁、JAVA中线程同步锁、mysql死锁检测机制、缓存锁等,在关系型数据库里又有行锁,表锁,读锁,写锁等锁,这个问题我觉得理解它是多向的,什么情况使用锁呢?
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突最有效的办法就是加入锁;
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁,实现悲观锁首先,在要锁定的表里,加一个字段如 lock_at 时间标志,表示当前记录被锁定时的时间, 当为 0 时,表示该记录未被锁定,当要修改某个记录时,先看看当前时间与 lock_at 字段相差是否超过预定的一个时长T,比如 30 分钟 ,1 小时 之类的,如果没超过,说明该记录有人正在修改,我们暂时不能修改。 否则,说明可以修改,主要通过这个时间戳实现的。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,实现乐观锁在程序里面我们需要定义两个方法,分别是使用乐观锁返回版本号没有使用锁返回null,在添加一条记录前,再次读取这个记录的版本号 字段,与之前读取的值进行比对,
- 如果版本号不同,说明在用户修改过程中,这个记录被别人改动过了。那么, 我们要给出提示。
- 如果版本号 相同,说明这个记录未被修改过。那么,对版本号 +1, 并保存这个记录。这样子就完成了记录的更新。同时,该记录的版本号也加了1。
zookeeper的数据可以支持临时节点的概念,即客户端写入的数据是临时数据,在客户端宕机后,临时数据会被删除,这样就实现了锁的异常释放。使用这样的方式,就不需要给锁增加超时自动释放的特性了。
缓存锁redis中SETNX 命令就搞定了,返回1代表加锁成功,返回0 表示锁被占用着。然后再用 DEL ***命令解锁,返回1表示解锁成功,0表示已经被解锁过
http://www.digpage.com/lock.html