1.悲观锁(关系型数据库里边常用到 | mysql)
悲观锁(Pessimistic Lock), 表面意思,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
-
行锁,表锁,读锁,写锁
-
行锁: 表面意思,对一行数据进行加锁
-
表锁: 表面意思,对表进行加锁(例如序列化操作就是对表进行加锁)
-
读锁: 表面意思,当有用户进行读操作时,其它用户不能进行读操作
-
写锁: 表面意思,当有用户进行写操作时,其它用户不能进行写操作
-
2.乐观锁(非关系型数据库里边常用到 | redis)
乐观锁(Optimistic Lock), 表面意思,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是利用这种check-and-set机制实现事务的。
-
版本号机制:
-
请求获取数据时会一并获取当前数据版本号 第一次获取
-
当进行写操作时会再次获取当前要操作数据的版本号 第二次获取
-
进行比较第一次获取数据时的版本号 与 现在操作的数据版本号(第二次获取的)是否一致
-
若一致继续写操作,操作完成时更改被操作数据版本号
-
若不一致,证明该数据已被其它用户修改,中断此次操作
-
-
乐观锁的实现:
-
在表中加入version字段
-
处理请求操作数据前,先获取当前数据的version值
-
准备修改数据时,再次获取当前数据version值,进行比较是否一致
-
每次写操作完成都对version字段进行修改
-