mysql第二篇

目录

  • 一、乐观锁和悲观锁的概念
  • 二、实现方式
  • 三、相关问题

一、乐观锁和悲观锁的概念

乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。
乐观锁:乐观锁在操作数据的时候非常乐观,认为别人不会在同一时刻修改数据,因此乐观锁不会上锁,只是在执行更新的时候判断一下在此时间别人是否修改了数据;如果别人修改了数据则放弃操作,否则执行操作
悲观锁:悲观锁在操作数据时总是认为别人会同时修改数据,因此操作数据时直接把数据锁住,等操作完成后才释放锁,别人在此期间不能修改数据

二、实现方式

乐观锁的实现方式:两种,CAS机制和版本号机制
悲观锁的实现方式:加锁,给代码块加锁,行锁,也可以对数据加锁(mysql的排他锁)
# CAS机制
CAS操作包括了3个操作数
1 需要读写的内存位置(v)
2 进行比较的预期值(A)
3 拟写入的新值(B)
操作逻辑:如果内存的位置的值等于预期的值,则将该位置更新为新值,否则不进行任何操作。许多CAS的操作是自旋的,如果操作不成功会一直重试直到操作成功为止
# 版本号机制
基本思路是在数据中增加一个字段version,表示该数据的版本号,每次修改数据,版本号加1,当某个线程查询数据时,将该数据的版本号一起查出来;当该线程更新数据时,判断当前版本号与之前读取的版本号是否一直,如果一致才进行操作

三、相关问题

# 既然CAS包含了Compare和Swap两个操作,它又如何保证原子性呢?
CAS是由CPU支持的原子操作,其原子性是在硬件层面进行保证的
# 乐观锁加锁吗?
乐观锁本身不加锁,只是更新数据的时候会判断是否被其他线程修改了
有时乐观锁可能会与加锁操作合并
# CAS有哪些缺点
1 ABA问题
就是线程1读取内存数据是A,线程2修改数据是B,线程2再次修改数据是A,线程1对数据进行CAS操作。但由于内存中的数据是A,因此CAS操作成功,但实际数据被线程2修改过了
2 CAS的本身自旋行为
在并发冲突较高的高竞争环境下,如果CAS操作一直失败会一直重试,CPU开销较大,针对这个问题就是引入退出机制,当重试次数到一定程度会失败退出,当然在更要的是避免在高竞争下使用乐观锁
3 功能限制
CAS机制本身只能保证单个变量操作的原子性,这意味着原子性不一定能保证线程安全,当涉及到多个变量,CAS也无能为力

你可能感兴趣的:(mysql,mysql)