本文主要是介绍Oracle 如何通过SQL语句对表中某一行数据加锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们都知道一些数据库加锁的理论,比如:表锁、行锁、悲观锁和乐观锁,但是由于平时写SQL的时候并没有真正使用过,所以只知道理论,并不知道如何去使用。
今天查了一下资料,对如何通过SQL语句加锁有了一些了解,特整理一下:
一. session的概念
session,即“会话”,在plsql中,一个新的SQL WINDOW就是一个新的session会话。
二. 建表并初始化数据
create table test(a number,b number);
insert into test values(1,2);
insert into test values(3,4);
insert into test values(8,9);
commit;
三. 使用for update 对表进行锁行操作
(1)新建一个SQL WINDOW,我们称之为session1,在session1中进行锁行操作
select * from test where a=1 for update;
我们还可以在for update语句后加上skip locked语句,过滤掉那些已经被其它session加上锁的行
select * from test where a=1 for update skip locked;
这时我们先不commit session1所做的修改;
(2)新建第二个SQL WINDOW,我们称之为session2,在session2中尝试进行锁行操作,注意这里要锁的数据与session1相同。结果会发现查询和加锁不成功,PLSQL页面一直显示为“executing”
select * from test where a in (1,2,3) for update;
(3) 这时我们把session1中的修改进行commit,此时发现session2中的可以查询出数据了。因为session1 commit后释放了锁,session2也就获得了锁可以进行操作了。
四、session1锁住了表,如何kill掉session1,使其释放锁?
--查询锁定记录,这条SQL没有认真研究,只是知道它可以查出数据库中哪些session中含有锁?
SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;
--kill掉带锁的session
ALTER system KILL session 'SID,serial#'
五、update语句同理
上边的例子都是在查询时加上for update来加锁,如果是更新的时候呢。其实是一样的,通过试验发现,当我们在session1中操作一条update语句(但是不commit)时,在session2中是无法更新这条数据的,原因就是这条数据已经被session1加上了锁,只有在session1提交或放弃锁后,session2才可以更新这条数据。
这篇关于Oracle 如何通过SQL语句对表中某一行数据加锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!