技术文摘
悲观锁与乐观锁的定义
悲观锁与乐观锁的定义
在软件开发中,多线程并发访问共享资源时可能会引发数据不一致等问题,而悲观锁与乐观锁是两种重要的并发控制机制,用于确保数据的完整性和一致性。
悲观锁,从名字就能看出它秉持一种悲观的态度。它认为在数据处理过程中,很可能会有其他线程同时对同一资源进行修改操作。在对共享资源进行读写操作前,悲观锁会先获取锁,将资源锁定。只有持有锁的线程才能对资源进行操作,其他线程则必须等待锁被释放。这种方式就像一个严格的管理员,只要有人要使用某个重要物品,就立刻将其独占,其他人只能排队等候。传统数据库中的行锁、表锁等都属于悲观锁的范畴。在银行转账操作中,当一个线程要修改账户余额时,悲观锁会锁定该账户记录,防止其他线程同时修改,保证了数据的准确性。不过,由于频繁的加锁和解锁操作,悲观锁在高并发场景下可能会导致性能瓶颈,因为大量线程等待锁会增加系统的开销。
乐观锁则持有乐观的看法。它假设在大多数情况下,各个线程对共享资源的操作不会发生冲突。所以,乐观锁并不会在操作前主动加锁。而是在数据提交更新时,检查在自己读取数据后到准备更新数据的这段时间内,数据有没有被其他线程修改过。这就好比大家都可以随意读取一个文件,但在保存修改时,系统会检查文件在读取后有没有被别人改过。如果没有,则允许更新;若有修改,更新操作会失败,线程需要重新读取数据并再次尝试更新。乐观锁通常通过版本号机制或时间戳来实现。在电商系统中,商品库存的修改可以使用乐观锁,多个用户读取库存时无需加锁,只有在实际扣减库存时才检查版本号,提高了系统的并发性能。但乐观锁也有局限性,在冲突频繁的场景下,可能导致大量的重试操作,降低系统效率。
悲观锁和乐观锁各有优缺点,在实际开发中,需要根据具体的业务场景和并发需求来合理选择使用,以实现高效、稳定的系统运行。
- SQLite 的优化策略
- Oracle 数据库连接失败(ORA-12514)故障全程排除
- Oracle 数据库 ID 自增与 UUID 生成问题
- Navicat 导入由 Oracle 导出的 DMP 文件
- Redis 与 IDEA 助力单机锁和分布式锁的实现过程
- Oracle 文本文件导出的三种途径(spool、UTL_FILE、sqluldr2)
- Oracle 中 temp 表空间丢失的处理办法
- Oracle 数据导出至文本及从文本导入的详细步骤
- Oracle 19c 中参数 sec_case_sensitive_logon 与 ORA-01017 错误的分析
- Redis 统计用户访问量的方法
- Redis 慢查询日志功能深度解析
- SQL Server 常用函数的总结与详解
- 解决 Oracle 报错:ORA-28001 口令已失效的办法
- Redis Brpop 命令的作用剖析
- Oracle 试用到期通过删除注册表继续试用 30 天的方法