简述MySQL 悲观锁与乐观锁 ?
参考答案:
MySQL 中的悲观锁和乐观锁是两种常见的资源并发锁设计思路,用于处理多个事务同时访问同一资源时可能出现的数据不一致问题。
- 悲观锁(Pessimistic Lock):
悲观锁假定在并发操作中会发生冲突,因此在数据处理过程中,总是保持对数据资源的锁定状态。这意味着,当一个事务正在对某个数据进行修改时,其他事务无法对该数据进行访问或修改,直到第一个事务完成并释放锁。在MySQL中,悲观锁通常通过行锁或表锁来实现。
Java中的synchronized
关键字就是悲观锁的一种实现方式。当线程要修改数据时,必须先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被阻塞。
- 乐观锁(Optimistic Lock):
与悲观锁相反,乐观锁假定在并发操作中不会发生冲突,因此在数据处理过程中不会锁定数据资源。只是在更新数据时,会判断在此期间有没有其他事务对数据进行过修改。如果有,则采取回滚等方式解决,否则完成更新。
乐观锁在数据库上的实现通常是基于数据版本记录机制。当读取数据时,会同时读取一个版本号或时间戳。在更新数据时,会检查版本号或时间戳是否发生变化。如果发生变化,说明有其他事务修改过数据,此时会拒绝当前事务的更新请求。
乐观锁的优点是避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。但是,如果实际并发冲突的频率很高,乐观锁会导致大量的更新失败和重试,这可能降低系统性能。
总的来说,悲观锁和乐观锁各有优缺点,选择哪种锁策略取决于具体的应用场景和需求。