oracle 带锁读,怎么再Oracle中进行读锁(二)

这一篇介绍一种更高级的实现方法,这使得无论是通过过程还是直接SQL访问都可以实现读锁的机制。

中如何实现读锁(一),上一篇文章给出了一种简单的方法,但是缺点也十分明显,就是要求用户必须采用调用函数的方式才能实现读锁。

很多情况下,上面的条件是无法实现的,这就要求必须有一种方法对于所有的访问情况都试用。

现在面临两个难题,一个是的读不加锁,因此必须自己实现锁的功能,二是如何将锁的实现添加到SELECT语句中,普通的触发器不会被SELECT所触发,因此通过触发器来实现这个功能是不现实的。

对于第一个问题,可以通过Oracle的DBMS_LOCK包来实现定制用户自定义锁的实现,而第二个问题可以利用Oracle的精细访问控制来实现。

简单描述一下思路,利用DBMS_LOCK.REQUEST过程,指定一个ID,来获取独占锁,其他会话获取同样的锁就会被锁定:

SQL> DECLARE

2 V_LOCK NUMBER;

3 BEGIN

4 V_LOCK := DBMS_LOCK.REQUEST(0, RELEASE_ON_COMMIT => TRUE);

5 END;

6 /

QL 过程已成功完成。

会话2获取同样的锁,就会被锁定:

SQL2> DECLARE

2 V_LOCK NUMBER;

3 BEGIN

4 V_LOCK := DBMS_LOCK.REQUEST(0, RELEASE_ON_COMMIT => TRUE);

5 END;

6 /

SQL> COMMIT;

提交完成。

会话2才解锁:

过程已成功完成。

SQL2> COMMIT;

提交完成。

利用DBMS_LOCK包可以实现锁的功能,下面就是利用DBMS_RLS包添加精细访问策略,在访问目标表的时候,将锁添加到查询语句中,简单的实现如下:

SQL> SELECT OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME = 'T';

OBJECT_ID

----------

93789

SQL> CREATE OR REPLACE FUNCTION F_POLICY(OBJECT_SCHEMA IN VARCHAR2, OBJECT_NAME IN VARCHAR2)

2 RETURN VARCHAR2 AS

3 V_NUM NUMBER;

4 BEGIN

5 RETURN 'DBMS_LOCK.REQUEST(93789, 6, 60) IN (0, 4)';

6 END;

7 /

函数已创建。

SQL> EXEC DBMS_RLS.ADD_POLICY(USER, 'T', 'MYPOLICY', USER, 'F_POLICY');

[1]

【责编:michael】

--------------------next---------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值