Oracle锁机制

增删改查中查询不需要锁,即使数据被锁定也能在还原信息中查询出锁定之前的值。其余三项均会使用行级锁,直到用户commit或rollbak。

锁是在指定语句的最低可能级别自动获取的 。增删改获取行级锁而不是块级或表级。修改对象(如移动表)会获取对象级锁,而不是方案锁或数据库锁。最大程度提供事务的并发性。

如多个事务需锁定同一资源,则先到的事务获得锁,之后的事务会自动进入排队等待。获得锁的会话可以申请转换锁而不必排到队尾,这样的会话在队列的优先级始终高于一般会话。

可进行手动锁定:

SQL>LOCK TABLE 表名 IN EXCLUSIVE MODE NOWAIT;

NOWAIT选项可无视其他用户的锁将控制权交给你。

DML(增删改)锁:每个DML语句将获得以下两个锁
1.一个或多个正在更改的行的行级锁。
2.一个ROW EXCLUSIVE模式的表锁,此模式锁允许对表进行并发操作,同时保证其他事务不会锁定整个表,并且可以保证DDL语句不会在DML语句修改数据过程中更改数据字典的元数据信息。

锁冲突解决方案:
1.在EM的“Performance(性能)”页上选择“Blocking Sessions (阻塞会话)”查看阻塞的会话ID、SQL语句等信息,找到用户使其发出commit、rollback命令或选中会话点击kill session终止会话。
2.使用SQL
(1)找出阻塞会话的SID、SERIAL#

SQL> select SID, SERIAL#, USERNAME 
from V$SESSION 
where SID in 
    (select BLOCKING_SESSION 
    from V$SESSION);

(2)杀掉阻塞的会话

SQL>ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;

被杀掉的会话会进行rollback并断开连接。

Oracle会自动检测死锁并终止一个语句。

posted @ 2018-10-03 22:30  epiphanyy  阅读(67)  评论(0)    收藏  举报  来源