Mysql锁 乐观锁与悲观锁

138 阅读2分钟

乐观锁与悲观锁 

锁机制

悲观锁、乐观锁,本身只是一个概念,不是某种特定的锁机制 

有不同的方法可以实现,和数据库本身没有关系 

本质上,不管基于哪种方法实现乐观锁,本质都是检验数据 

悲观锁是基于数据库实现的,用到了数据库排它锁、共享锁 

乐观锁应用例子

1、何谓数据版本,即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的   “version” 字段来实现

    当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一

    当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据

     例如:update table_name set column1 = 'XXXXX', version = version+1 where version = 123; 

2、使用时间戳(timestamp),这一种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似

    也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突

   例如:update table_name set column1 = 'XXXXX', version_time = unix_timestamp() where version_time = 1606459691;

3、使用状态值(status),这一种实现方式同样是在需要乐观锁控制的table中增加一个字段 status, 不需要提前获取数据,一般用于需要状态流转的流程控制中

      比如 存在状态值 1、2、3,需要控制状态值只可以从1变更为2,2变更为3,这样在更新提交的时候检查当前状态值和合法状态值进行对比,如果一致则OK,否则就是版本冲突

     例如:update table_name set stauts= 2 where status = 1;