0

0

[Oracle] 锁(Lock)的探讨

php中文网

php中文网

发布时间:2016-06-07 17:29:27

|

1063人浏览过

|

来源于php中文网

原创

Oracle当中的锁通常是业务层面的问题,锁是为了在并发的情况下保证数据库的一致性,因此没有并发就没有锁。Oracle的锁有如下几个

1、锁(Lock)的原则

oracle当中的锁通常是业务层面的问题,锁是为了在并发的情况下保证数据库的一致性,因此没有并发就没有锁。oracle的锁有如下几个原则:

2、TM锁和TX锁

  • TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。
  • TX锁 事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。
  • TM锁和TX锁的对象不一样,,TM锁针对表,TX锁针对行,如下图所示,对某一行进行修改,加两个锁,其中一个是在修改的行上加TX锁,防止其它会话对该行的修改;另一个是在表上加TM锁,防止表DDL被修改。

     

     

    3、TM锁的机种模式(lock mode)

  • Row Share (RS) --2
  • This lock, also called a subshare table lock (SS), indicates that the transaction holding the lock on the table has locked rows in the table and
    intends to update them. A row share lock is the least restrictive mode of table lock, offering the highest degree of concurrency for a table.
  • Row Exclusive Table Lock (RX)---3
  • This lock, also called a subexclusive table lock (SX), generally indicates that the transaction holding the lock has updated table rows or issued
    SELECT ... FOR UPDATE. An SX lock allows other transactions to query, insert, update, delete, or lock rows concurrently in the same table.
    Therefore, SX locks allow multiple transactions to obtain simultaneous SX and subshare table locks for the same table.
  • Share Table Lock (S) --4
  • A share table lock held by a transaction allows other transactions to query the table (without using SELECT ... FOR UPDATE), but updates are
    allowed only if a single transaction holds the share table lock. Because multiple transactions may hold a share table lock concurrently,
    holding this lock is not sufficient to ensure that a transaction can modify the table.
  • Share Row Exclusive Table Lock (SRX) ---5
  • This lock, also called a share-subexclusive table lock (SSX), is more restrictive than a share table lock. Only one transaction at a time can
    acquire an SSX lock on a given table. An SSX lock held by a transaction allows other transactions to query the table (except for SELECT ... FOR
    UPDATE) but not to update the table.
  • Exclusive Table Lock (X) ---6
  • This lock is the most restrictive, prohibiting other transactions from performing any type of DML statement or placing any type of lock on the
    table.

     

    上面摘自官方文档,比较抽象,下面这个表格更容易理解:

     

    3、演示几种锁定的例子

    首先,创建测试表t:

    SQL> create table t (id int primary key);

     

    表已创建。

    两个session的id为:

    session 1: 200

    session 2: 202

     

    1) Insert

    在session 1中插入一条数据,不提交:

    SQL> insert into t values (1);

     

    已创建 1 行。

    在session 2中插入同一条数据,阻塞发生:

    SQL> insert into t values (1);

    查看v$lock:

    SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by sid, type;

     

    SID TY ID1 ID2 LMODE REQUEST BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ----------

    200 TM 74584 0 3 0 0

    200 TX 524317 1048 6 0 1

    202 TM 74584 0 3 0 0

    202 TX 524317 1048 0 4 0

    202 TX 65539 677 6 0 0

    session 1在该行上持有mode=6的TX锁,session 2在该行上请求TX锁,导致它被阻塞。

    注意:在11g中多了一个锁(看最后一行),这是一个TX锁,且ID1,ID2和前面的都一样,想不明白这个锁的用途是什么。

     

    2)update

    在session 1中更新id=1的那行,不提交:

    SQL> update t set id=2 where id=1;

     

    已更新 1 行。

    在session 2中更新同一行数据,发生阻塞:

    SQL> update t set id=3 where id=1;

    查看v$lock:

    SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by sid, type;

     

    SID TY ID1 ID2 LMODE REQUEST BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ----------

    200 TM 74584 0 3 0 0

    200 TX 131092 822 6 0 1

    202 TM 74584 0 3 0 0

    202 TX 131092 822 0 6 0

     

    3)Delete

    在sesssion 1中删除一行,不提交:

    SQL> delete from t where id=1;

     

    已删除 1 行。

    在session 2中删除同一行,发生阻塞:

    SQL> delete from t where id=1;

    查看v$lock:
     

    Sheet+
    Sheet+

    Excel和GoogleSheets表格AI处理工具

    下载
    4、RI锁---基于引用关系的锁定

    当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表上也可能加上相应的锁定。下面模拟RI锁定导致阻塞的场景:

    分别创建主表和从表:

    SQL> create table p(id int primary key);

     

    表已创建。

     

    SQL> create table c(id int references p(id));

     

    表已创建。

    在主表中插入一行数据:

    SQL> insert into p values(1);

     

    已创建 1 行。

    查看v$lock:

    SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by sid, type;

     

    SID TY ID1 ID2 LMODE REQUEST BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ----------

    200 TM 74587 0 3 0 0

    200 TM 74589 0 3 0 0

    200 TX 524299 1051 6 0 0

    可以看出在主表和从表上都加了TM锁。

    5、死锁 两个会话互相持有对方资源导致死锁。死锁的出现说明业务设计有问题,需要从业务逻辑上进行重新设计。

    Oracle可以自动监控死锁,并强制让其中一个session释放资源的方式解决死锁问题,如:

     

    在session 1中插入数据id=1:

    SQL> insert into t values (1);

     

    已创建 1 行。

     

    在session 2中插入数据id=2:

    SQL> insert into t values (2);

     

    已创建 1 行。

     

    再在session 1中输入数据id=2,阻塞发生:

    SQL> insert into t values (2);

     

    从v$lock中查看锁定情况:

    SQL> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by sid, type;

     

    SID TY ID1 ID2 LMODE REQUEST BLOCK

    ---------- -- ---------- ---------- ---------- ---------- ----------

    200 TM 74584 0 3 0 0

    200 TX 65550 687 0 4 0

    200 TX 262176 648 6 0 0

    202 TM 74584 0 3 0 0

    202 TX 65550 687 6 0 1

     

    再在session 2中插入数据id=1,死锁出现:

    SQL> insert into t values (1);

     

    Oracle在死锁出现后,自动释放其中一个session的资源,解决死锁问题:

    SQL> insert into t values (2);

    insert into t values (2)

    *

    第 1 行出现错误:

    ORA-00060: 等待资源时检测到死锁


    关于Lock和Latch的区别请看:

    linux

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    go语言 注释编码
    go语言 注释编码

    本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

    32

    2026.01.31

    go语言 math包
    go语言 math包

    本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

    23

    2026.01.31

    go语言输入函数
    go语言输入函数

    本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

    16

    2026.01.31

    golang 循环遍历
    golang 循环遍历

    本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

    5

    2026.01.31

    Golang人工智能合集
    Golang人工智能合集

    本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

    6

    2026.01.31

    2026赚钱平台入口大全
    2026赚钱平台入口大全

    2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

    268

    2026.01.31

    高干文在线阅读网站大全
    高干文在线阅读网站大全

    汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

    195

    2026.01.31

    无需付费的漫画app大全
    无需付费的漫画app大全

    想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

    170

    2026.01.31

    漫画免费在线观看地址大全
    漫画免费在线观看地址大全

    想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

    85

    2026.01.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    SQL 教程
    SQL 教程

    共61课时 | 3.7万人学习

    Java 教程
    Java 教程

    共578课时 | 55.4万人学习

    成为PHP架构师-自制PHP框架
    成为PHP架构师-自制PHP框架

    共28课时 | 2.5万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号