快捷搜索: 王者荣耀 脱发

数据库中有两种基本的锁类型

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

  根据保护的对象不同,Oracle数据库锁可以分为以下几大类:

  DML锁(data locks,数据锁),用于保护数据的完整性;

  DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;

  内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;

  在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点;

  DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

  当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如下图所示:

  值 锁模式 锁描述 SQL

  0 NONE

  1 NULL 空 SELECT

  2 SS(ROW-S) 行级共享锁

  其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、

  LOCK ROW SHARE

  3 SX(ROW-X) 行级排它锁

  在提交前不允许做DML操作 INSERT、UPDATE、DELETE、

  LOCK ROW SHARE

  4 S(SHARE) 共享锁 CREATE INDEX、LOCK SHARE

  5 SSX(S/ROW-X) 共享行级排它锁 LOCK SHARE ROW EXCLUSIVE

  6 X(eXclusive) 排它锁 ALTER TABLE、DROP TABLE、DROP INDEX、

  TRUNCATE TABLE、LOCK EXCLUSIVE

  在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

经验分享 程序员 微信小程序 职场和发展