✅乐观锁与悲观锁如何实现
发布网友
发布时间:2024-10-16 23:40
我来回答
共1个回答
热心网友
时间:2024-10-17 23:16
在MySQL中,悲观锁的实现依赖于数据库的锁机制。首先需要关闭MySQL数据库的自动提交属性,然后使用select ... for update语句进行加锁。
悲观锁的流程如下:以电商平台下单扣减库存为例,在对id=1的记录进行修改前,使用FOR UPDATE方式进行加锁,然后进行修改。这种方式是典型的悲观锁策略。
在并发修改库存的代码中,同一时间只有一个线程可以开启事务并获得id=1的锁,其他事务必须等待当前事务提交后才能执行。这样可以保证当前数据不会被其他事务修改。
使用SELECT ... FOR UPDATE会锁住数据,但需要注意锁的级别。MySQL InnoDB默认使用行级锁,基于索引的。若SQL语句未使用索引,优化器可能会选择锁表以提高性能。
乐观锁通过CAS机制实现,通常使用版本号(version)来处理。当多个线程尝试更新同一个变量时,只有其中一个线程能成功更新,其他线程会失败,并可以再次尝试。
以扣减库存为例,更新前先查询库存数(stock),然后在更新时将库存数作为修改条件。提交更新时,对比数据库表记录的当前库存数与第一次查询得到的库存数,若相等则执行更新,否则视为数据已过期。
悲观锁在对数据库数据进行修改时,为了避免同时被其他人修改,最好直接对该数据进行加锁以防止并发。这种方式称为悲观并发控制(PCC),它为数据处理的安全性提供了保证。
悲观锁是一种保守的策略,即“先取锁再访问”。在效率方面,处理加锁机制会增加数据库的开销,增加死锁风险,并可能降低并行性。
乐观锁是相对悲观锁而言的,假设数据在一般情况下不会发生冲突,因此提交更新时才实际检查数据是否冲突。与悲观锁相比,乐观锁不使用数据库锁机制,通过记录数据的版本信息实现。
在乐观锁与悲观锁的选择上,主要看两者的区别和适用场景。根据具体业务需求选择合适的并发控制策略。在高并发场景下,可以选择合适的并发控制策略。