一、锁的概念
1、锁是数据库用来控制共享资源并发访问的机制。
2、锁用于保护正在被修改的数据
3、直到提交或回滚了事务之后,其他用户才可以更新数据
二、锁定的优点
1、一致性 - 一次只允许一个用户修改数据
2、完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
3、并行性 -允许多个用户访问同一数据
三、锁的类型
1、行级锁——对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
(1)行级锁是一种排他锁,防止其他事务修改此行
(2)在使用以下语句时,Oracle会自动应用行级锁(也会加表级锁):INSERT,UPDATE,DELETE,SELECT … FOR UPDATE(也会加表级锁)
(3)SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新【锁定一张表,select * from emp for update,不可以update,delete,但可以insert into数据】
(4) 使用COMMIT或ROLLBACK语句释放锁
(5)例子
a、scott用户更新emp表的empno=7369行,未提交,会锁行
查看锁:视图 v$lock,TM表级锁,TX行级锁
b、system用户也更新,但更新过程出现等待过程
select * from dba_object d where object_id=75335
查看锁:视图 select * from v$lock,TM表级锁,TX行级锁
c、查看TM表级锁中的ID1,此处的锁,是scott的emp表
select ADDR,KADDR,SID,TYpe,ID1 from v$lock where type='TM'or type='TX';
d、因为scott用户在更新emp中,未提交,所以system用户update的表,无法进行锁表。它等待scott将empupdate完成后,再进行锁表,锁行
对scott的update操作提交(commit)或回滚(rollback):
(6)、select * form emp where sal=1000 for update;
后面加for update,会加锁,如果要消除这个锁,就rollback。
select ... for update的用途:锁定一张表,select * from emp for update,不可以update,delete,但可以insert into数据)
(7)select ... for update wait 5;锁定一张表或某几行,只等待5秒钟,如果超过5秒钟仍被其他人占用锁定,就不进行等待了
(8)select ... for update nowait ;锁定一张表或某几行,等待,被其他人占用锁定,就返回错误。
2、表级锁
(1)锁定整个表,限制其他用户对表的访问
(2)使用命令显示地锁定表,应用表级锁的语法是: LOCK TABLE table_name IN [mode---row share,row exclusive,share,share row exclusive,exclusive] MODE;
(3)表级锁的类型
a、行共享 (ROW SHARE) ——禁止排他(exclusive)锁定表;lock table emp in row share mode;禁止exclusive(a) 类型操作,在此期间,exclusive操作无法锁定此表,但可以允许(b、c、d类型的锁),且对行可以进行增、删、改;
b、行排他(ROW EXCLUSIVE) ——禁止使用排他锁(exclusive)和共享锁(share);
c、共享锁(SHARE)——锁定表,
仅允许其他用户查询表中的行;
禁止其他用户插入、更新和删除行;
多个用户可以同时在同一个表上应用此锁(此处和select * from emp for update不同);
lock table emp in share mode =select * from emp for update;
d、共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁(share)及更高的锁
e、排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
3、死锁
(1)当两个事务相互等待对方释放资源时,就会形成死锁
(2)Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
文章评论