跳到主要内容

简述MySQL 悲观锁与乐观锁 ?

参考答案:

MySQL 中的悲观锁和乐观锁是两种常见的资源并发锁设计思路,用于处理多个事务同时访问同一资源时可能出现的数据不一致问题。

  1. 悲观锁(Pessimistic Lock):

悲观锁假定在并发操作中会发生冲突,因此在数据处理过程中,总是保持对数据资源的锁定状态。这意味着,当一个事务正在对某个数据进行修改时,其他事务无法对该数据进行访问或修改,直到第一个事务完成并释放锁。在MySQL中,悲观锁通常通过行锁或表锁来实现。

Java中的synchronized关键字就是悲观锁的一种实现方式。当线程要修改数据时,必须先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被阻塞。

  1. 乐观锁(Optimistic Lock):

与悲观锁相反,乐观锁假定在并发操作中不会发生冲突,因此在数据处理过程中不会锁定数据资源。只是在更新数据时,会判断在此期间有没有其他事务对数据进行过修改。如果有,则采取回滚等方式解决,否则完成更新。

乐观锁在数据库上的实现通常是基于数据版本记录机制。当读取数据时,会同时读取一个版本号或时间戳。在更新数据时,会检查版本号或时间戳是否发生变化。如果发生变化,说明有其他事务修改过数据,此时会拒绝当前事务的更新请求。

乐观锁的优点是避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。但是,如果实际并发冲突的频率很高,乐观锁会导致大量的更新失败和重试,这可能降低系统性能。

总的来说,悲观锁和乐观锁各有优缺点,选择哪种锁策略取决于具体的应用场景和需求。