oracle中的并发是由于两个或两个以上的用户对同一个资源进行争夺而引发的一种并发行为,这就导致了我们所说的锁,锁是为了保持数据的一致性
引起阻塞的一些情况:
1:表中的唯一性约束会引起阻塞(同时对同一条数据做修改,删除,或者新增),如果事物还没有提交或者事务回滚,那么oracle为了保持数据的一致性,就会把其它进程操作此条数据的任务阻塞在外,如果一直没有提交事务或者回滚,那么锁就会一直存在
2:select for update会引起阻塞,在修改同一条数据的时候,为了防止其他进程修改次数据,可以选择select for update。。。这样就可以把其他对此条数据操作的进程阻塞在外
3:从表中外键没有设置索引,在生产上 如果数据量很大,每删除一条主表数据,它就会全表扫面一次从表数据看有没有于此对应的数据,这样的速度是很慢的,如果对外键设置了索引,可以极大的调高效率
遇到死锁情况:
1:查找死锁进程:
select s.username,l.object_id,l.session_id,s.serial#,l.oracle_username,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;
USERNAME OBJECT_ID SESSION_ID SERIAL# ORACLE_USERNAME OS_USER_NAME PROCESS
------------------------------ ---------- ---------- ---------- ------------------------------ ------------------------------ ------------
SYS 52777 158 89 SYS XIEHUI\Administrator 3188:3200
SYS 52777 150 14 SYS XIEHUI\Administrator 3840:3844
2:kill掉这个死锁的进程
alter systerm kill session (sid,serial#,);