oracle table-lock的5种模式

Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table <table_name> in </table_name> name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如 果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S)

还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

详细参考concepts文档中的"Type Of Locks": http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937
评论
2 楼 xiaoxiao1984 2008-06-20  
select for update 应该是row share mode的锁, 也就是行级的share锁, 而share row exclusive mode 应该是禁止其他session以share mode来锁表的, 所以share row exclusive mode的锁会阻塞select for update的锁
1 楼 xiaoxiao1984 2008-06-20  
如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如果能够select for update, 也就意味着可以更新阿, 在10g上的尝试结果如下:
session 1:
SQL> rollback;

回退已完成。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> lock table hr.jobs in share row exclusive mode nowait;

表已锁定。

SQL> show user
USER 为 "SYS"
SQL>

session 2:
SQL> rollback;

回退已完成。

SQL> show user;
USER 为 "HR"
SQL> select * from hr.jobs where job_id like 'ST%' for update nowait;
select * from hr.jobs where job_id like 'ST%' for update nowait
                 *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

使用share row exclusive mode锁定的时候,其他session 应该不能进行insert/update/delete/drop 等操作, 同样也不能进行select for update
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值