一 、乐观锁和悲观锁
【悲观锁】意思就是A查询的时候,B不能查询 修改
所谓悲观锁就是基于数据库机制实现的。
比如在在使用select子句的时候加上for update,
那么直到改子句的事务结束为止,任何应用都无法修改select出来的记录。
【乐观锁】个人认为乐观锁就是表里有一个存放版本version的字段,修改的时候查询出来比如version是1,A修改完之后将其version加1为2放入数据库,这时候B也在查询version值也是1,修改完后也加了1放入数据库2,此时插入的话版本号已经有2了,这时候驳回B的请求
所谓乐观锁是基于应用的版本机制来实现的。
数据库中帐户信息表中有一个 version字段,当前值为1;而当前帐户余额字段(balance)为$100。
1、操作员A 此时将其读出(version=1),并从其帐户余额中扣除$50 ($100-$50)。
2、在操作员A操作的过程中,操作员B也读入此用户信息(version=1),并从其帐户余额中扣除$20($100-$20)。
3、操作员A完成了修改工作,将数据版本号加一(version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version更新为2。
4、操作员B完成了操作,也将版本号加一(version=2)试图向数据库提交数据(balance=$80),但此时比对数据库记录版本时发现,操作员B提交的数据版本号为2,数据库记录当前版本也为2,不满足“提交版本必须大于记录当前版本才能执行更新“的乐观锁策略,
因此,操作员B 的提交被驳回。这样就避免了操作员B 用基于version=1 的旧数据修改的结果覆盖操作员A的操作结果的可能。
乐观锁机制避免了长事务中的数据库加锁开销(操作员A 和操作员B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系 统整体性能表现。
乐观锁、悲观锁 是从是否锁数据方面进行分类。
共享锁、排它锁是从 锁的类型进行分类。
以上转载自:http://blog.sina.com.cn/s/blog_548bd2090100ir7k.html