悲观锁:
- 策略:悲观锁假设冲突是常见的,因此在数据处理过程中(如读取或修改数据)会先锁定数据,防止其他事务对这些数据进行并发修改。
- 锁定行为:事务在访问数据时直接进行锁定,其他事务必须等待锁释放后才能对数据进行操作。
- 适用场景:适用于多事务竞争访问同一数据资源且冲突概率高的环境。
- 优点:在高冲突环境中可以保持数据的一致性。
- 缺点:可能降低并发性能,增加了死锁的可能性,同时锁定资源可能导致其他事务等待,影响系统的响应时间。
乐观锁:
- 策略:乐观锁假设冲突较少发生,不会在事务开始时就锁定数据。而是在事务提交的时候检查在事务执行期间是否发生了冲突。
- 冲突检测:通常是通过数据版本号(如时间戳或者递增序列)来实现。在事务提交前,检查数据的版本号是否发生改变,如果改变了,表示有其他事务对数据进行了修改。
- 适用场景:适用于冲突概率低,读多写少的应用环境。
- 优点:提高了系统的并发性,因为大部分时间不需要锁定资源,减少了不必要的等待和锁竞争。
- 缺点:如果冲突发生,可能需要额外的重试逻辑处理,并且在高并发冲突环境中可能会降低性能。