Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6790934
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: Oracle

2014-01-24 15:51:53

原文地址:解决Oracle锁表 作者:dahailinux

                                                        解决Oracle锁表

###############     概述:     ######################
锁表是很容易发生的现象,当有多人对表进行操作时就容易发生。如下是解决锁表的步骤

###############     锁表原因:    ####################
由于Oracle数据库具有保持数据的一致性,所以当一个人对表进行操作,没有提交,另一个人在需要操作的时候,就不能操作,必须等表提交,就一直处于等待状态,就导致锁表。

###############    锁表报错信息:   ##################
如果发现修改一个表数据时不能提交而报下面的错误:
Record is locked by another user

###############    解决方法:   #####################
杀死会话进程或者再执行sql语句,然后提交。

###############    解决步骤:     ####################
1. 登陆数据库,以sys用户登陆
SQL> conn /as sysdba
Connected.
SQL> 
SQL> 
SQL> 
2. 查询哪些会话被锁。
SQL> select t2.username, t2.sid, t2.serial#, t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;


USERNAME                              SID    SERIAL# LOGON_TIME
------------------------------ ---------- ---------- -------------------
IPMS                                  494      10320 2014-01-23 08:03:38
IPMS                                  479      25009 2014-01-23 08:04:50
HCBA                                  401      59957 2014-01-23 08:43:23


SQL> 
SQL> 
SQL> 
2.1. 查看会话具体内容
SQL> select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=&sid order by piece;
Enter value for sid: 494  ------     (在此输入sid号
old   1: select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=&sid order by piece
new   1: select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=494 order by piece


SQL_TEXT
----------------------------------------------------------------
UPDATE IPMS.IS_STANDARD D  SET D.IS_LOCKCOUNT = D.IS_LOCKCOUNT -


                        (SELECT SUM(M.IM_APPLYNUM)




                 FROM IS_MATERIALAPPLY M




    WHERE M.IM_GBID IN
                                (SELECT




SQL_TEXT
----------------------------------------------------------------
G.IGB_ID
                                   FROM IPMS.IS_GRANTB


ILL G  INNER JOIN IPMS.WWF_INSTANCE I ON G.IGB_FLOWID =  I.INSTA
NCE_ID
                                  WHERE I.INSTANCE_ID=:I


NSTANCE_ID)
                            AND D.IM_ID = M.IM_ID


                            AND D.IS_LOCK = 1


SQL_TEXT
----------------------------------------------------------------




        )


10 rows selected.
2.2 查询会话具体内容
SQL> select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=&sid order by piece;
Enter value for sid: 479(在此输入sid号
old   1: select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=&sid order by piece
new   1: select sql_text from v$session a,v$sqltext_with_newlines b where decode(a.sql_hash_value,0,prev_hash_value,sql_hash_value)=b.hash_value and a.sid=479 order by piece


SQL_TEXT
----------------------------------------------------------------
begin
  sys.dbms_output.get_line(line => :line, status => :statu


s);
end;



3. 杀死该会话
根据刚才查询出来的sid号和serial值。

SQL> 
SQL> alter system kill session '494,10320';


System altered.


SQL> alter system kill session '479,25009';


System altered.


SQL> commit;


Commit complete.


SQL> 
阅读(1181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~