锁的概述
1)锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制
2)达梦数据库中锁的类别
ddl锁:自动的施加和释放
dml锁:事务开始时施加,使用Commit或者Rollback释放
3)死锁: 当两个用户希望持有对方的资源时就会发生死锁。即两个用户互相等待对方释放资源,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。
锁的查看
SELECT * FROM V$SESSION;--查看会话和锁的信息
SELECT * FROM V$SESSION_WAIT;--查看等待的会话信息
SELECT * FROM V$LOCK;--系统中所有锁
SELECT * FROM V$LOCKED_OBJECT;--系统中DML锁
测试
新建两个测试表,插入数据提交
create table lock1 (id number,name varchar(50));
insert into lock1 values(1,'aaaa');
insert into lock1 values(2,'bbbb');
create table lock2 (id number,name varchar(50));
insert into lock2 values(1,'ssss');
insert into lock2 values(3,'dddd');
commit;
执行下面更新语句,不要提交
update lock1 set name='sss' where id=1;
update lock2 set name='ss' where id=1;
打开新窗口,执行如下:
打开另一个新窗口,执行如下:
根据V$SQL_HISTORY可以查看想要的历史记录
通过v$lock视图查到当前数据库中锁的状态,如下可看到有两个事务114326,114327 被事务 114320所阻塞
根据V$sessions 和v$lock 查询产生阻塞的事务会话
select s.sess_id,s.SQL_TEXT,s.RUN_STATUS from v$sessions s , v$lock l where l.tid=s.trx_Id and l.blocked=1;
解决办法
1 如上所示查询出产生阻塞的事务会话id,只需要在该会话下提交或回滚事务,锁自然会被释 放,阻塞解决
2 使用系统过程SP_CLOSE_SESSION(SESS_ID)来关闭对应的会话
select 'SP_CLOSE_SESSION(' ||s.sess_id||')' from v$sessions s,v$lock l where s.trx_id=l.tid and l.blocked=1;
执行会话之后,可以看到被阻塞的会话已经成功执行
SP_CLOSE_SESSION(2516820264)
锁预防和总结
1.经常提交以避免长时间锁定行。
2.避免使用LOCK命令锁定表。
3.另外需注意,需监测系统中死锁,调查为什么这些锁正被保持,频率;当死锁发生通过回滚事务rollback或者终止会话来解决它。