oracle中的锁

你。 提交于 2019-12-04 20:37:12

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

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!