orcle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部。
在oracle数据库中,它并不是对某个表加上锁或者某几行加上锁,锁是以数据块的一个属性存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,这个地方叫做ITL(INTERESTRED TRANASCTION LIST),凡是在这个数据块上有活动的事务,它的信息就会记录在这里面供后续的操作查询,保证事务的一致性。
在oracle数据库中,不存在真正意义上属于某个对象或数据的锁。oracle锁的信息是数据块的一个物理属性,而不是逻辑上属于某个表或者某个行。
-----------------------------------------------------------------------------------------------------------------------
按照操作分为DML锁,DDL锁和system locks
首先需要知道的是:
在数据行上只有X锁(排他锁):
在 Oracle 数据库中,当一个事务首次发起一个 DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后, TX 锁被释放,其他会话才可以加锁。
当 Oracle 数据库发生 TX 锁等待时,如果不及时处理常常会引起 Oracle 数据库挂起,或导致死锁的发生,产生ORA-600 的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
DML分为表级锁(TM)与行级(事务)锁(TX)。
TM锁(表级锁)
TM 锁用于确保在修改表的内容时,表的结构不会改变,例如防止在 DML 语句执行期间相关的表被移除。当用户对表执行 DDL 或 DML 操作时,将获取一个此表的表级锁。
当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行 DDL 语句影响记录行的更新。
事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用 LOCK TABLE 语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用 LOCK TABLE 显示的定义一个表级的共享锁。
TM 锁包括了 SS、 SX、 S、 X 等多种模式,在数据库中用 0-6 来表示。不同的 SQL 操作产生不同类型的 TM 锁.
TM 锁类型表
TX 锁( 事务锁或行级锁)
当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。
事务发起第一个修改时会得到TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。
对用户的数据操纵, Oracle 可以自动为操纵的数据进行加锁,但如果有操纵授权,则为满足并发操纵的需要另外实施加锁。
DML 锁可由一个用户进程以显式的方式加锁,也可通过某些 SQL 语句隐含方式实现。 这部分属于 Manual Data Locks。
原理:一个事务要修改块中的数据,必须获得该块中的一个itl,通过itl和undo segment header中的transaction table,可以知道事务是否处于活动阶段。事务在修改块时(其实就是在修改行)会检查行中row header中的标志位,如果该标志位为0(该行没有被活动的事务锁住),就把该标志位修改为事务在该块获得的itl的序号,这样当前事务就获得了对记录的锁定,然后就可以修改行数据了,这也就是oracle行锁实现的原理。
DML 锁有如下三种加锁方式:
- 共享锁方式( SHARE)
- 独占锁方式( EXCLUSIVE)
- 共享更新锁( SHARE UPDATE)
其中:
SHARE, EXCLUSIVE 用于 TM 锁(表级锁)
SHARE UPDATE 用于 TX 锁( 行级锁)
题目:
An employee salary in the non-partitioned EMPLOYEES table, has been updated but the transaction is uncommitted.
Which two types of lock are held by the transaction?
A) an exclusive lock on the EMPLOYEES table
B) a null lock on the EMPLOYEES table
C) a null lock on the row being updated
D) a row level lock on the row being updated
E) a row shared lock on the EMPLOYEES table
答案:A/D