锁(学习笔记)
行级锁定和表级锁定:
行级锁定:
当用户执行了,INSERT,UPDATE,DELETE及SELECT FOR UPDATE语句时,
ORACLE将隐式的实现记录的锁定,如果事务没有提交,回滚,就一直在锁定状态,一直到事务提交后,才会将数据锁释放
表级锁定:
表级锁定需要用户明确的使用LOCK TABLE语句手工锁定
语法
LOCK TABLE 表名称|视图名称,表名称|视图名.... IN 锁定模式 MODE[NOWAIT]
NOWAIT这是一个可选项,当视图锁定一张表时,如果发现已经被其他事务锁定时,不会等待
锁:共享锁和排它锁.
锁分以下几种:
ROW SHARE 行共享锁 |
在锁定期间允许其他事务并发对表进行各种操作,但不允许任何事务对同一张表进行独占操作(禁止排它锁) |
ROW EXCLUSIVE 行排它锁 |
允许用户进行任何操作,与行共享锁不同的是它不能防止其它事务对同一张表进行手工锁或者独占操作 |
SHARE 共享锁 |
其它事务只能执行是查询操作,不能修改操作 |
SHARE ROW EXCLUSIVE 共享排它锁 |
能许任何用户进行查询操作,但不允许其它用户使用共享锁 共享排它锁的常见应用 |
EXCLUSIVE:排它锁 |
事务将以独占方式锁定表,其它用户允许查度,但不能修改也不能设置任何的锁 |
死锁:
将事务自动提交关闭
SET AUTOCOMMIT=OFF 取消自动处理,开启事务处理
悲观锁:查询到数据后使用FOR UPDATE 将数据锁定
第一个会话执行
SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;
第2个会话也执行
SELECT * FROM myemp WHERE deptno=10 FOR UPDATE;
发现第2个会话,一直在等待,不执行
第一个会话执行COMMIT或者ROLLBACK后,会话2才可以执行
乐观锁:把所有锁定都延迟到即将执行更新之前
使用UPDATE 表名 set 字段 WHERE 字段1=查询出的状态,AND字段2=查询出的状态
在第一个SESSION上针对emp表使用共享锁
LOCK TABLE emp IN SHARE MODE NOWAIT
第二个SESSION中删除emp全部数据
DELETE FROM emp;
因是共享锁,第二个SESSION应该只能查度不能修改,所以一直在等待
解锁:
管理员登录
查看数据库中的锁定
SELECT session_id,oracle_username,process FROM v$locked_object;
可以发现死锁的SESSION_ID;
查询V$session数据字典
SELECT sid,serial#,username,lockwait,status FROM v$session where sid IN(SESSION_ID);
可以查询到Serial#
通过
ALTER SYSTEM KILL SESSION'sid,serial#';
解除死锁