本文讲解开发经常会遇到的情况,即锁表与表解锁。
锁表
1、执行DML操作未提交锁表
当一个表被多个人操作时,假设A进行了DML操作,在没有提交的情况下,该表是上锁的,B是无法对该表进行DML操作的。若B进行DML,则会一直等待,直到该表解锁。如下步骤:
- 打开一个cmd,然后A查询表ex1。
- A对表ex1做delete操作,但不执行commit,就把运行界面一直放着。
- 这时打开另一个cmd,B仍然可以查询到表ex1。
- 但B无法再对表ex1进行delete操作,这时我们称表ex1被锁住了。
- 若B很迫切的想进行DML操作,但是一直处于等待,这时就要对该表解锁。
2、手动锁表
登录scott用户,锁住表ex1。
--共享锁(S锁)
lock table ex1 in share mode nowait;
解锁表
解锁其实很容易,假设以上说的A、B所使用的cmd就在两隔壁,关闭A的cmd,这样B的delete操作就能正常运行了。难的是,开发并不知道还有谁在操作着这个数据库,也不知道谁执行了DML操作未提交,这时,就需要找到这个被锁住的会话,并将之杀死(kill)。
1、查询锁住的表
select lo.SESSION_ID sid,
s.SERIAL# serial_id,
lo.LOCKED_MODE 锁类型,
ao.OWNER 对象拥有着,
ao.OBJECT_NAME 对象名,
lo.OBJECT_ID 对象id,
s.LOGON_TIME 登录时间
from v$locked_object lo, all_objects ao, v$session s
where lo.OBJECT_ID = ao.OBJECT_ID
and lo.SESSION_ID = s.SID
2、杀死该会话
alter system kill session ‘sid,serial#’;
alter system kill session '226,2985';
以上就是表上锁和解锁的全过程,希望能给看到这篇博客的人一些帮助。