增删改查中查询不需要锁,即使数据被锁定也能在还原信息中查询出锁定之前的值。其余三项均会使用行级锁,直到用户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会自动检测死锁并终止一个语句。