暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何锁定表和解锁表?

原创 小小亮 2022-10-27
4272

锁表

Oracle 提供LOCK TABLE语句让用户根据需要锁定表。例如:

SQL> conn hr/hr@orclpdb
Connected.
SQL> lock table employees in exclusive mode;

Table(s) Locked.

LOCK TABLE语法锁定模式可以是以下级别之一。

  • ROW SHARE
  • ROW EXCLUSIVE
  • SHARE UPDATE
  • SHARE
  • SHARE ROW EXCLUSIVE
  • EXCLUSIVE

但是如何确保表被锁定?我们可以对V$LOCKED_OBJECT发出查询来确定它。

SQL> show user
USER is "SYSTEM"
SQL> column owner format a20;
SQL> column object_name format a20;
SQL> column object_type format a10;
SQL> select o.owner, o.object_name, o.object_type, l.locked_mode from all_objects o, v$locked_object l where o.object_id = l.object_id;

OWNER      OBJECT_NAME          OBJECT_TYPE          LOCKED_MODE
---------- -------------------- -------------------- -----------
HR         EMPLOYEES            TABLE                          6

锁定 ID 6 表示独占锁定模式。

如果您有更永久的解决方案,您可以通过进入 READ ONLY 模式来冻结表格

解锁表

没有明确的UNLOCK TABLE语句来释放锁。您应该使用以下技术之一来解锁表。

1. 提交和回滚

COMMITROLLBACK是事务控制语句,都具有轻松破锁的能力。如果数据正确更改,您可以发出COMMIT来确认。否则使用ROLLBACK拒绝更改。例如:

SQL> rollback;

Rollback complete.

请注意,虽然SAVEPOINT也是一个事务控制语句,但它不能终止事务,所以不会释放锁。

2.数据定义语言(DDL)

由于数据定义语言 (DDL)隐式提交所有更改,因此它打破了上述事务的所有锁定。例如:

SQL> alter table employees modify (employee_id number(10));

Table altered.

请注意,TRUNCATE和GRANT语句也是 DDL,它肯定会移动LAST_DDL_TIME

3. 用户退出

如果用户正常退出其会话,则隐式COMMIT随之而来。这将释放会话的所有锁。

4.杀死会话

如果您无法控制拥有锁的会话,您可以终止会话以强制它释放锁,然后是隐式ROLLBACK

总之,要释放表锁,我们需要发出一个信号来终止事务,即COMMITROLLBACK


原文标题:How to Lock Table and Unlock Table

原文作者:  Ed Chen

原文链接:https://logic.edchen.org/how-to-lock-and-unlock-table/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论