在 Oracle 数据库中,latch(互斥锁)和 lock(锁)是两个不同的概念,它们的区别如下:
1、作用范围:
Latch:用于保护共享结构的互斥控制,例如保护内存结构或者数据结构。
Lock:用于实现事务的隔离和并发控制,用于保护特定的数据资源(如表、行)。
2、争用方式:
Latch:采用自旋方式(spin)来争用资源,即在获取不到资源时,进程会反复尝试获取而不会进入阻塞状态。
Lock:采用阻塞方式来争用资源,当一个事务获取不到资源时,会进入阻塞状态等待其他事务释放资源。
3、控制对象:
Latch:用于控制并发读取内存结构,如控制缓冲池、共享池等。
Lock:用于控制事务对数据资源的并发操作,如锁定表、行、索引等。
4、类型:
Latch:Oracle 数据库中有多种类型的 Latch,如共享 Latch(Shared Latch)和排它 Latch(Exclusive Latch)等,每种类型的 Latch 用于不同的目的。
Lock:Oracle 数据库中有多种类型的 Lock,如共享锁(Shared Lock)和排它锁(Exclusive Lock)等,根据事务隔离级别的不同,事务可以获取不同类型的锁。
5、阻塞情况:
Latch:在竞争激烈的情况下,Latch 争用可能导致进程需要等待获取资源,但等待时间通常较短。Latch 通常会在很短时间内释放,以减少争用。
Lock:如果一个事务持有某个资源的排它锁(X锁),其他事务想要获取该资源的排它锁时,会被阻塞,需要等待该事务释放锁。
6、总体来说
latch 是用于内存结构的互斥控制,采用自旋方式,由 Oracle 数据库自动管理;
而 lock 是用于数据资源的并发控制,采用阻塞方式,由应用程序或事务控制语句(如 SELECT FOR UPDATE)显式申请和释放。
它们在作用范围、争用方式、控制对象、类型、阻塞情况等方面有所差异。