参考:https://blog.youkuaiyun.com/u013991521/article/details/53535818
https://www.cnblogs.com/yx007/p/9077939.html
查询被锁表的sid等信息
select t2.username,
t2.sid,
t2.serial#,
t3.object_name,
t2.OSUSER,
t2.MACHINE,
t2.PROGRAM,
t2.LOGON_TIME,
t2.COMMAND,
t2.LOCKWAIT,
t2.SADDR,
t2.PADDR,
t2.TADDR,
t2.SQL_ADDRESS,
t1.LOCKED_MODE
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.object_id = t3.object_id
order by t2.logon_time;
根据sid获取 导致锁表的sql语句
select b.sql_text
from v$session a, v$sql b
where a.sid = 9591 --session_id
and a.SQL_ADDRESS = b.ADDRESS(+)
根据sid解除锁
alter system kill session 'sid,serial#';
insert锁表问题:
主键用的是序列,insert不会锁表,再高的并发都不会,它锁的是当前序列好,如果insert id = 1,还没有commit,他锁的是当前序列号,即序列号为1,如果在commit之前又有了一条数据,序列号会自动为2,这个时候,id=1 回退,序列号不会跟着回退。
死锁的情况:两个insert语句同时试图向一个表中插入PK或unique值相同的数据(在主键列中插入同一个数据,如都插入id=1),而造成其中会话被阻塞,等待其它会话提交或回滚,因而造成死锁。这种情况,只要其中任何一个session提交,另外一个就会报出ORA-00001:违反唯一性约束条件,死锁终止;或者其中一个session回滚,另外一个即可正常执行,这可以就引证了上面的解释,先把id=1 锁列锁住了,又要去插入一条id=1的数据,肯定不行撒。
个人总结:
如何没主键,insert应该是不存在锁的。只有存在主键的时候,才会有锁,如果主键是自增序列,高并发下也不会有问题,如果不是序列,可以保证主键都会不一样,也没问题,平时uuid用的多,如果高并发下,uuid有重复的值,就会出现问题。