Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》

阿丹:

        首先在谈到并发控制机制的时候,我们通常会提及两种重要的锁策略。悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)。这两个是在处理并发的时候采取的不同思路。

悲观锁:

        悲观锁: 悲观锁机制认为并发操作中会有冲突,因此默认情况下假设会出现并发冲突,因此采取阻止或延迟访问的方式来保证一致性和隔离性。悲观锁的基本思想是,在数据的访问和修改过程中,假设其他事务会对该数据进行修改,因此在操作数据之前,先获取锁来保护资源的完整性。

当一个事务试图获取悲观锁时,它会将资源标记为已锁定状态,其他事务如果要访问该资源,必须等待锁释放。这种锁定通常是独占锁,在锁被持有期间,其他事务无法读取或修改数据,从而保证了数据的一致性和隔离性。悲观锁常用的实现方式是加锁机制,如共享锁(Shared Lock)和排他锁(Exclusive Lock)。

阿丹解读:

        就是悲观锁认为所有的资源都要使用我这个,然后当我在执行一个事务的时候,我就给所有的东西锁死了。一直到我解决完了当前的事务别人才能从我这里访问资源。如果我在锁上的时候啥我都不给。悲观锁说我要保证一致性,所以就进行了独占锁(排他锁)。来解决冲突。

乐观锁

        乐观锁: 乐观锁机制则采取了一种更加乐观的假设,它认为并发操作中冲突的概率较低。乐观锁的基本思想是,在操作数据之前,不会加锁,也不会阻止其他事务的并发访问。相反,事务在进行修改前,会先获取数据的一个快照或版本,并在操作完成时对数据进行一致性验证。

        在乐观锁中,每个事务通常会关联一个版本号、时间戳或序列号,这些信息用于识别数据的版本。在读取和修改数据时,事务会使用这些信息来验证数据是否被其他事务修改过。如果数据的版本与事务启动时的版本一致,则可以继续操作;如果版本不一致,说明在操作过程中数据已被修改,乐观锁机制会回滚事务或触发相应的冲突处理逻辑。

        乐观锁常用的实现方式包括添加额外的字段来记录版本信息,例如在数据库中添加一个版本号字段或使用时间戳来标记数据的更新时间。

        悲观锁和乐观锁各有优缺点,适用于不同的场景。悲观锁机制保证了数据的强一致性和隔离性,但可能导致较高的锁冲突和性能开销。乐观锁机制允许更高的并发性能,但需要应用程序代码对冲突进行适当处理,以保证数据的一致性。

阿丹解读:

        乐观锁其实就是在我去进行数据库落库操作之前的之前,谁来读取我都给。因为我在我进行逻辑操作计算的时候保存了一个类似于快照的东西。乐观锁只需要在落库之前对比一下我的数据和快照一样不一样,如果一样就说明我没和别人冲突就正常落库。如果不一样就是在我进行计算的时候有人和我冲突了。我就回滚。

        所以乐观锁只锁了写没有锁读,所以对于其他的事务来说更友好。乐观锁对操作加了锁。

其他的并发控制机制

在数据库系统中,常用的并发控制机制包括以下几种:

  1. 锁机制(Locking):锁机制是最常见、最基本的并发控制机制之一。它通过使用锁来保护共享资源,防止多个事务同时读取或修改同一份数据。锁可以分为共享锁(Shared Lock)和排他锁(Exclusive Lock),以允许读取共享数据或独占修改数据。

  2. 多版本并发控制(MVCC,Multi-Version Concurrency Control):MVCC通过对数据的版本管理来实现并发控制。它为每个事务创建数据的独立版本,并通过版本号或时间戳来识别数据的不同版本,从而避免了读-写冲突和写-写冲突。MVCC通常使用乐观锁来进行并发控制。

  3. 串行化(Serializability):串行化是一种较为保守的并发控制机制,它确保事务以串行的方式执行,从而避免了并发冲突。串行化通常使用锁机制、时间戳或序列号等方式来实现,但由于事务的串行执行,可能会导致性能瓶颈。

  4. 快照隔离(Snapshot Isolation):快照隔离是一种基于版本管理的并发控制机制,它为每个事务提供一个快照(Snapshot)来读取数据。每个事务在开始时读取数据的快照,并在事务提交时进行验证。快照隔离提供了较高的并发性能和隔离性,但可能导致一些读取操作的不一致性。

  5. 时间戳排序(Timestamp Ordering):时间戳排序是一种并发控制机制,它通过为每个事务分配全局唯一的时间戳来实现。事务按时间戳的先后顺序执行,从而避免了并发冲突。时间戳排序通常需要一个中心时钟或全局时钟来生成时间戳。

你可能感兴趣的:(mysql,mysql,数据库,oracle)