推荐答案
乐观锁 (Optimistic Locking)
乐观锁假设在大多数情况下,数据不会发生冲突,因此允许多个事务同时读取和修改数据。在提交时,系统会检查数据是否被其他事务修改过。如果没有冲突,则提交成功;如果有冲突,则回滚并提示用户重新尝试。
悲观锁 (Pessimistic Locking)
悲观锁假设在大多数情况下,数据会发生冲突,因此在事务开始时就会锁定数据,防止其他事务读取或修改数据。只有在事务完成后,才会释放锁,允许其他事务访问数据。
本题详细解读
乐观锁的实现
乐观锁通常通过版本控制来实现。在数据库表中添加一个版本号字段(如 version
),每次更新数据时,版本号加一。在提交事务时,系统会检查当前版本号是否与读取时的版本号一致。如果一致,则提交成功;如果不一致,则回滚并提示用户重新尝试。
-- 示例:乐观锁的实现 UPDATE table_name SET column1 = value1, version = version + 1 WHERE id = some_id AND version = current_version;
悲观锁的实现
悲观锁通常通过数据库的锁机制来实现。在事务开始时,使用 SELECT ... FOR UPDATE
或 SELECT ... LOCK IN SHARE MODE
语句锁定数据,防止其他事务读取或修改数据。只有在事务完成后,才会释放锁。
-- 示例:悲观锁的实现 START TRANSACTION; SELECT * FROM table_name WHERE id = some_id FOR UPDATE; -- 执行其他操作 COMMIT;
适用场景
- 乐观锁:适用于读多写少的场景,冲突较少的情况下,可以提高并发性能。
- 悲观锁:适用于写多读少的场景,冲突较多的情况下,可以避免数据不一致的问题。
优缺点对比
乐观锁:
- 优点:提高并发性能,减少锁的开销。
- 缺点:在冲突较多的情况下,可能导致多次重试,影响性能。
悲观锁:
- 优点:避免数据不一致的问题,适合高冲突场景。
- 缺点:降低并发性能,增加锁的开销。