Oracle表被鎖

   前几天调试存储过程时,Oracle莫名报错,当存储过程执行到一段SQL时,怎么等也执行不过去,最后把这段sqlCOPY出来单独执行OK,当修改里面具体的一条记录时,提示表已被其他用户占用,原来如此,是Oracle的行锁啊!

**下面是俩种方法查找锁:
   1. 可以用Enterprise Manager Console控制台,用System或Sys用户登录,登录后点锁,正常的情况下是没有任务锁的,非正常情况下会有相应被锁的信息;
   登录后:
   点击 例程 — 锁,下面过滤器选择:用户类型锁,就可以看到当前数据库锁的信息;

   2. 因为Oracle是装在Linux下,所有可以用sql/plus命令方式进去看锁信息,具体操作如下:
    su - oracle;
    sqlplus /nolog;
    conn system/密码;  或者 connect/as sysdba;
    使用下面的语法查出锁:
     SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;

**解决办法:
   1. 用Enterprise Manager Console控制台,选中后 右键 中断会话 — 立即 ,OK;
   2. 用sql/plus命令杀掉进程,ALTER SYSTEM KILL SESSION 'SID,SERIAL#',OK;

可以使用以下SQL语句查看锁表的信息: ``` SELECT a.session_id, a.oracle_username, b.owner, b.object_name, b.object_type, a.locked_mode FROM v$locked_object a, all_objects b WHERE a.object_id = b.object_id; ``` 其中,`v$locked_object`是包含锁表信息的视图,`all_objects`是Oracle中所有对象的元数据视图。这个查询可以显示锁定对象的会话ID,用户名,所属者,对象名称,对象类型和锁定模式等信息。如果你想查看特定的锁定信息,则可以添加一个额外的过滤条件,例如: ``` SELECT a.session_id, a.oracle_username, b.owner, b.object_name, b.object_type, a.locked_mode FROM v$locked_object a, all_objects b WHERE a.object_id = b.object_id AND b.object_name = 'TABLE_NAME'; ``` 这将显示名为“TABLE_NAME”的的锁定信息。如果你想查看锁定的SQL语句,可以通过以下步骤: 1. 执行上述查询,找到锁定的会话ID。 2. 使用该会话ID查询V$SESSION视图,以获取该会话的详细信息: ``` SELECT username, osuser, machine, program, sql_id FROM v$session WHERE sid = 'SESSION_ID'; ``` 在这里,`username`是会话的用户名,`osuser`是连接到数据库的操作系统用户,`machine`是客户端计算机的名称,`program`是客户端使用的应用程序名称,`sql_id`是当前会话正在执行的SQL语句的ID。 3. 使用SQL_ID查询`V$SQL`视图,以获取该语句的完整文本: ``` SELECT sql_text FROM v$sql WHERE sql_id = 'SQL_ID'; ``` 这将显示正在执行的SQL语句的完整文本,包括锁定的语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值