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才可以更新这条数据。


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle SQL语句是用于在Oracle数据库中进行数据操作和查询的命令集合。它使用结构化查询语言(SQL)作为与数据库进行交互的方式。 Oracle SQL语句可以分为数据操作语言(DML)和数据定义语言(DDL)两种类型。 在DML中,常见的操作包括插入(INSERT)、更新(UPDATE)、删除(DELETE)和查询(SELECT)。通过INSERT语句,可以将新的数据行插入到表中;通过UPDATE语句,可以对现有数据进行修改;通过DELETE语句,可以从表中删除数据行;通过SELECT语句,可以查询符合条件的数据行。DML语句通常用于对表中数据进行增删改查操作。 而DDL语句主要用于对数据库对象进行定义和操作,常见的操作包括创建表(CREATE TABLE)、修改表(ALTER TABLE)和删除表(DROP TABLE)。通过CREATE TABLE语句,可以创建新的表并定义表的结构和约束;通过ALTER TABLE语句,可以修改表的结构;通过DROP TABLE语句,可以删除表及其数据。DDL语句通常用于对数据库对象进行管理和维护操作。 除了DML和DDL语句,Oracle SQL还提供了其他的语句类型,如控制语句(例如,IF-THEN-ELSE语句)、事务控制语句(例如,COMMIT和ROLLBACK语句)以及数据查询语句中的聚合函数(例如,SUM和COUNT函数)等。 通过编写和执行Oracle SQL语句,我们可以实现对Oracle数据库中的数据进行增删改查操作,同时还可以对数据库对象进行定义和管理。掌握Oracle SQL语句的使用,可以帮助我们高效地进行数据库操作和管理,从而提高数据处理和查询的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值