表
1.进行update 、delete 操作的窗口没有提交有在另一个窗口执行了更新或者删除动作。
2.在外键上没有加索引引起的死锁(这个要注意,设置了外键同时增加索引)
3.两个表之前不同顺序之间的相互更新操作引起的死锁(如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低)
解锁表:
SELECT 'alter system kill session ' || '''' || lo.SESSION_ID || ',' || vss.SERIAL# || ''' immediate;', dob.OBJECT_NAME Table_Name, lo.SESSION_ID, lo.locked_mode, vss.SERIAL#, vss.action Action, vss.osuser OSUSER, vss.LOGON_TIME, vss.process AP_PID, VPS.SPID DB_PID from v$locked_object lo, dba_objects dob, v$session vss, V$PROCESS VPS
where lo.OBJECT_ID = dob.OBJECT_ID
and lo.SESSION_ID = vss.SID
AND VSS.paddr = VPS.addr AND dob.OBJECT_NAME LIKE '%表名(要大写)%'
order by lo.SESSION_ID, lo.LOCKED_MODE, DOB.object_name;
执行查询出来的alter语句,可以杀掉死锁。
包
对应DDL锁的是DDL语句,DDL语句全称数据定义语句(Data Define Language)。用于定义数据的结构或Schema,如:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME。当我们在执行某个存储过程、或者编译它的时候Oracle会自动给这个对象加上DDL锁,同时也会对这个存储过程所引用的对象加锁。当我们试图编译、修改存储过程、函数、包等对数据对象的时候,如果别人也正在编译或修改他们时就会产生锁等待;或者我们在编译某个存储过程的时候,如果它所引用的数据库对象正在被修改应该也会产生锁等待。
结论:不要同时对包进行编译,不要一直让包处于edit状态,调试完要及时关闭调试窗口(至少要commit结果),尽量不要在正式包调试方法。
解锁包:
SELECT DISTINCT 'alter system kill session ' || '''' || sid || ',' || serial# || ''' immediate;' FROM dba_ddl_locks a, v$session ss WHERE a.name LIKE '%包名(大写)%' AND a.session_id = ss.sid;
执行查询出来的alter语句,可以杀掉死锁。
标签:vss,解决方案,OBJECT,死锁,session,lo,oracle,ID From: https://www.cnblogs.com/CoolBinGao/p/17431129.html