Microsoft Word - 刘盛ACOUG Library2.docx



Similar documents
说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

深圳市新亚电子制程股份有限公司

I


金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

珠江钢琴股东大会


抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审


国债回购交易业务指引


马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

《C语言基础入门》课程教学大纲

中 国 软 科 学 年 第 期!!!

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

 编号:

工 程 勘 察 资 质 标 准 根 据 建 设 工 程 勘 察 设 计 管 理 条 例 和 建 设 工 程 勘 察 设 计 资 质 管 理 规 定, 制 定 本 标 准 一 总 则 ( 一 ) 本 标 准 包 括 工 程 勘 察 相 应 专 业 类 型 主 要 专 业 技 术 人 员 配 备 技 术

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

第2章 数据类型、常量与变量

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

ETF、分级基金规模、份额变化统计

Microsoft Word - 第7章 图表反转形态.doc

浙 江 天 册 律 师 事 务 所 关 于 杭 州 电 缆 股 份 有 限 公 司 2015 年 年 度 股 东 大 会 的 法 律 意 见 书 发 文 号 :TCYJS2016H0228 致 : 杭 州 电 缆 股 份 有 限 公 司 根 据 中 华 人 民 共 和 国 证 券 法 ( 下 称 证

徐天宏:《基因天堂》.doc

上海证券交易所会议纪要

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

Microsoft Word - 文件汇编.doc

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

第 四 条 建 设 单 位 对 可 能 产 生 职 业 病 危 害 的 建 设 项 目, 应 当 依 照 本 办 法 向 安 全 生 产 监 督 管 理 部 门 申 请 职 业 卫 生 三 同 时 的 备 案 审 核 审 查 和 竣 工 验 收 建 设 项 目 职 业 卫 生 三 同 时 工 作 可

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

办 法 >( 修 订 稿 ) 的 议 案 关 于 提 请 任 子 行 网 络 技 术 股 份 有 限 公 司 股 东 大 会 授 权 董 事 会 办 理 公 司 限 制 性 股 票 激 励 计 划 相 关 事 宜 的 议 案 确 定 公 司 的 限 制 性 股 票 激 励 计 划 相 关 事 项 如

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

修改版-操作手册.doc

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

一、资质申请

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

附件1:

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

上证指数

2006年顺德区高中阶段学校招生录取分数线

·岗位设置管理流程

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

金融全渠道银行彩页中文版0702

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

公 开 刊 物 须 有 国 内 统 一 刊 (CN), 发 表 文 章 的 刊 物 需 要 在 国 家 新 闻 出 版 广 电 总 局 ( 办 事 服 务 便 民 查 询 新 闻 出 版 机 构 查 询 ) 上 能 够 查 到 刊 凡 在 有 中 国 标 准 书 公 开

证券代码: 证券简称:长城电脑 公告编号:

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>


登录、注册功能的测试用例设计.doc

2.5 选 举 陈 晓 非 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.6 选 举 卢 婕 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.7 选 举 张 文 君 先 生 为 第 六 届 董 事 会 独 立 董 事 候 选 人 的 议 案

关于修订《沪市股票上网发行资金申购

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅


新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

证监会行政审批事项目录

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

<4D F736F F D20C6F3D2B5C5E0D1B5CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

2014年中央财经大学研究生招生录取工作简报

课程类 别

三武一宗灭佛研究

GB

抗 日 战 争 研 究! 年 第 期 # # # # #!!!!!!!! #!!

21 业 余 制 -- 高 起 专 (12 级 ) 75 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 江 西 化 校 工 科 22 业 余 制 -- 高 起 专 (12 级 ) 70 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 吉


教师上报成绩流程图

思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想

2016年德州市机构编制委员会

<4D F736F F D20B6C0C1A2B6ADCAC2D0ECCCFABEFDCFC8C9FABCB0CCE1C3FBC8CBC9F9C3F72E646F63>

上海证券交易所会议纪要

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

内 容 二 : 建 立 并 完 善 了 三 点 的 网 络 教 学 管 理 体 系 内 容 三 : 注 重 培 养 学 生 的 听 说 能 力 14

!!!!!!!!!!

收 入 支 出 项 目 2016 年 预 算 项 目 2016 年 预 算 预 算 01 表 单 位 : 万 元 ( 保 留 两 位 小 数 ) 一 公 共 财 政 预 算 拨 款 一 人 员 经 费 一 般 财 力 人 员 支 出 成 品

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

激 励 计 划 设 定 的 第 三 个 解 锁 期 解 锁 条 件 是 否 达 到 解 锁 条 件 的 说 明 1 公 司 未 发 生 如 下 任 一 情 形 : 1 公 司 最 近 一 个 会 计 年 度 财 务 会 计 报 告 被 注 册 会 计 师 出 具 否 定 意 见 或 者 无 法 表

《遗情书》

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

2016年南开大学MBA招生信息

秦川发展第五届第三次

《深圳市场首次公开发行股票网上按市值申购实施办法》.doc


合 并 计 算 配 售 对 象 持 有 多 个 证 券 账 户 的, 多 个 证 券 账 户 市 值 合 并 计 算 确 认 多 个 证 券 账 户 为 同 一 配 售 对 象 持 有 的 原 则 为 证 券 账 户 注 册 资 料 中 的 账 户 持 有 人 名 称 有 效 身 份 证 明 文 件

国 际 中 国 研 究 动 态 是 中 国 社 会 科 学 院 国 际 中 国 学 研 究 中 心 出 品 的 以 介 绍 国 际 中 国 问 题 研 究 最 新 成 果 为 宗 旨 的 电 子 杂 志 计 划 每 月 出 版 一 期 除 编 译 和 摘 编 网 络 和 中 外 期 刊 库 上 可

Transcription:

Oracle LOCK 内 部 机 制 中 国 Oracle 用 户 组 作 者 : 刘 盛 (Leonarding) http://www.acoug.org 版 本 发 布 时 间 1.0 2014/02/28 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 1

目 录 1 分 别 模 拟 insert,update 和 delete 造 成 阻 塞 的 示 例... 26 2 模 拟 RI 锁 定 导 致 阻 塞 的 场 景, 并 分 析 v$lock 相 应 的 锁 定 信 息, 给 出 SQL 演 示... 26 3 自 己 构 想 一 个 使 用 手 工 锁 定 解 决 一 种 业 务 需 求 的 场 景, 并 给 出 SQL 演 示... 26 4 给 出 从 mode 2-6 的 TM 锁 相 互 间 的 互 斥 示 例... 26 5 给 出 一 个 导 致 死 锁 的 SQL 示 例... 26 6 总 结... 26 Leonarding 的 个 人 简 介... 26 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 2

摘 要 :Oracle 锁 在 我 一 开 始 接 触 的 时 候 会 有 一 种 高 深 莫 测 的 感 觉, 就 像 是 遥 远 的 外 星 人 看 不 见 摸 不 着 但 是 能 感 觉 到, 我 在 实 际 的 工 作 中 就 遇 到 过 ORA-00054: resource busy acquire with nowait specified( 资 源 正 忙, 指 定 以 nowait 方 式 获 取 资 源 例 如 select * from leo where number>1 for update nowait; 如 果 不 想 让 其 他 会 话 继 续 等 待, 可 以 用 nowait 方 式 获 得 一 个 通 知 而 无 需 等 待 下 去 ) 错 误 不 能 插 入 表, 当 时 知 道 是 被 锁 定 了, 根 据 V$LOCK 也 定 位 出 阻 塞 的 会 话 了, 但 不 知 道 如 何 长 久 的 解 决 它, 究 其 原 因 就 是 不 清 楚 内 部 机 制 与 释 放 原 理, 下 面 根 据 例 子 来 揭 开 锁 的 面 纱, 走 进 Oracle 锁 的 世 界 1 模 拟 Insert/Update/Delete 造 成 阻 塞 LEO1@LEO1> create user leo2 identified by leo2 default tablespace leo1; // 新 创 建 一 个 LEO2 用 户 User created. LEO1@LEO1>grant connect,resource to leo2; // 授 予 基 本 权 限 Grant succeeded. LEO1@LEO1> select owner,table_name,tablespace_name from dba_tables where owner='leo1'; OWNER TABLE_NAME TABLESPACE_NAME -------- -------- LEO1 LEO_WAGE LEO1 LEO1@LEO1> create table t1 (id int primary key); // 创 建 t1 表, 设 置 id 列 为 主 键 Table created. LEO1@LEO1> insert into t1 values(1); 1 row created. LEO1@LEO1> select * from t1; ID 1 LEO2@LEO1> insert into leo1.t1 values(1); // 当 没 有 提 交, 在 插 入 同 样 的 values 时 就 发 生 了 对 会 话 的 阻 塞,hang 在 这 里 不 能 前 进 LEO1@LEO1> commit; // 必 须 提 交 后, 阻 塞 才 终 止, 也 就 是 说 commit 可 以 释 放 阻 塞 Commit complete. LEO2@LEO1> insert into leo1.t1 values(1); // 因 为 已 经 有 了 1 值, 故 违 反 了 主 键 约 束 insert into leo1.t1 values(1) * ERROR at line 1: http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 3

ORA-00001: unique constraint (LEO1.SYS_C0010817) violated 分 享 知 识 收 获 快 乐 http://www.acoug.org update 锁 阻 塞 LEO1@LEO1> select * from t1; ID 1 2 100 LEO1@LEO1> update t1 set id=200 where id=100; // 更 新 一 行 没 有 提 交, 没 有 提 交 的 事 物 对 别 人 是 不 可 见 的, 但 在 物 理 块 上 真 真 切 切 的 修 改 了, 他 人 只 能 访 问 undo 回 滚 段 中 镜 像 1 row updated. LEO2@LEO1> update leo1.t1 set id=300 where id=100; // 我 们 在 会 话 leo2 上 也 更 新 同 一 个 表 里 的 同 一 行, 此 时 hang 住 了 不 动 了, 因 为 2 个 会 话 在 争 用 同 一 条 记 录 的 修 改 权 // 一 般 影 响 业 务 性 能 的 就 TM and TX 锁 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73449 0 3 0 0 138 TX 196615 912 6 0 1 156 TM 73449 0 3 0 0 156 TX 196615 912 0 6 0 SID: 会 话 id 号 TYPE: 锁 的 类 型 ID1: 会 话 操 作 对 象 的 id 号 ID2:ID1+ID2 定 位 回 滚 段 上 的 一 个 地 址 ( 即 修 改 之 前 数 据 镜 像 地 址 ), 由 于 138 和 156 会 话 是 一 样 的 说 明 指 向 的 是 同 一 个 地 址, 换 句 话 说 操 作 的 是 同 一 行 数 据 LMODE: 锁 模 式, 不 同 的 数 字 代 表 不 同 的 锁 模 式 例 如 0 现 在 没 有 申 请 到 锁 3 共 享 锁 模 式 ( 段 级 共 享 锁 ) 6 排 他 锁 模 式 锁 的 级 别 越 高 限 制 越 多 REQUEST: 目 前 会 话 没 有 锁, 正 在 申 请 的 锁 模 式 例 如 0 没 有 正 在 申 请 的 锁, 说 明 已 经 有 锁 了 6 现 在 正 在 申 请 6 号 锁, 目 前 因 为 没 有 才 申 请 BLOCK: 当 前 正 在 阻 塞 几 个 会 话 例 如 1 当 前 正 在 阻 塞 一 个 会 话 2 当 前 正 在 阻 塞 两 个 会 话 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 4

锁 的 实 质 : 是 维 护 一 个 事 务 完 整 性 的, 锁 的 信 息 是 数 据 块 的 一 个 属 性, 是 物 理 的, 并 不 是 逻 辑 上 属 于 某 个 表 或 者 某 几 行 的 LEO1@LEO1> select distinct sid from v$mystat; // 这 个 会 话 当 前 id 是 138, 我 们 怎 么 区 分 呢?=> LEO1 用 户 =138 LEO2 用 户 =156 SID 138 LEO1@LEO1> select object_name from dba_objects where object_id=73449; //138 会 话 操 作 的 对 象 是 T1 表 OBJECT_NAME T1 说 明 :138 会 话 在 T 表 上 加 了 TM 和 TX 锁,TM 锁 模 式 为 3( 共 享 锁 ) TX 锁 模 式 6( 排 他 锁 ), 目 前 TX 锁 正 在 阻 塞 一 个 会 话 ( 就 是 156 会 话 ) 156 会 话 就 是 当 前 被 阻 塞 的 会 话,156 会 话 操 作 对 象 也 是 T1 表 (ID1 都 一 样 的 ),TM 锁 模 式 也 为 3( 共 享 锁 就 是 有 几 个 会 话 就 可 以 创 建 几 个 共 享 锁, 同 时 存 在 ),TX 现 在 还 没 有 申 请 到 锁, 正 在 申 请 6 号 锁, 而 这 个 6 号 锁 就 是 138 会 话 所 持 有 的 ( 因 为 2 个 会 话 操 作 的 是 同 一 行 数 据 ) LEO1@LEO1> select sid,event from v$session_wait where sid in (138,156); // 从 会 话 等 待 视 图 上 可 以 看 出, 有 哪 些 会 话 由 于 什 么 原 因 导 致 等 待 事 件 不 能 前 进 SID EVENT ---- 138 SQL*Net message to client 156 enq: TX - row lock contention 156 会 话 由 于 TX 锁 争 用 原 因 导 致 hang 住 不 能 前 进,enq=enqueues 队 列 锁 ( 通 常 和 业 务 有 关, 为 了 保 护 业 务 的 锁 ) 小 结 : 现 在 我 们 应 该 很 晴 朗 的 看 出 138 会 话 阻 塞 156 会 话, 以 及 阻 塞 的 原 因 和 会 话 数 和 锁 类 型 insert 锁 阻 塞 LEO1@LEO1> select * from leo1.t1; ID 1 2 200 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 5

LEO1@LEO1> insert into leo1.t1 values(3); 插 入 一 行 但 没 有 提 交, 这 是 一 个 未 决 状 态, 还 不 清 楚 是 否 真 正 插 入 1 row created. LEO2@LEO1> insert into leo1.t1 values(3); 我 们 在 会 话 leo2 上 也 插 入 同 样 的 数 据, 此 时 hang 住 了 不 动 了, 这 里 实 际 上 是 插 入 了 2 条 独 立 的 记 录, 不 能 认 为 是 同 一 条 记 录, 只 是 值 一 样 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73449 0 3 0 0 138 TX 65555 681 6 0 1 138 正 在 阻 塞 另 一 个 会 话 156 TM 73449 0 3 0 0 156 TX 458766 669 6 0 0 这 也 显 示 了 在 插 入 第 二 条 记 录 时 没 有 被 阻 塞 156 TX 65555 681 0 4 0 而 在 插 入 的 修 改 值 相 同 后 被 阻 塞 了, 锁 的 级 别 是 4 insert 时 v$lock 视 图 里 面 多 了 一 个 TX 锁 ( 就 是 最 后 一 行 ), 首 先 说 明 一 下 insert 和 update delete 操 作 的 不 同, 后 两 者 都 是 对 同 一 条 记 录 的 修 改 权 争 用 产 生 阻 塞 ( 这 里 不 涉 及 修 改 值 的 问 题 ), 而 insert 操 作 实 际 上 插 入 了 2 条 不 同 的 记 录, 由 于 这 2 条 不 同 的 记 录 的 修 改 值 一 样 违 反 了 主 键 约 束 从 而 产 生 阻 塞, 实 际 是 对 修 改 值 的 相 同 产 生 了 阻 塞 锁 的 级 别 为 4, 这 种 锁 比 update 的 锁 级 别 要 低, 锁 的 级 别 越 低 限 制 越 少 delete 锁 阻 塞 LEO1@LEO1> select * from leo1.t1; t1 表 中 有 5 条 记 录, 我 们 计 划 删 除 的 是 最 后 1 条 ID 1 2 4 5 200 LEO1@LEO1> delete from leo1.t1 where id=200; 138 会 话 正 在 删 除 id=200 的 记 录, 但 是 没 有 提 交, 此 时 就 是 加 上 一 个 TM TX 锁 1 row deleted. http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 6

LEO2@LEO1> delete from leo1.t1 where id=200; 这 时 158 会 话 也 做 同 样 的 动 作, 就 被 hang 住 了 不 能 动 了, 下 面 我 们 来 看 看 锁 定 情 况 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73449 0 3 0 0 138 TX 524316 935 6 0 1 138 会 话 持 有 一 个 6 级 排 他 锁, 正 在 阻 塞 一 个 会 话 156 TM 73449 0 3 0 0 156 TX 524316 935 0 6 0 156 会 话 被 阻 塞 住 了 没 有 获 得 锁, 正 在 申 请 一 个 6 级 锁 LEO1@LEO1> select object_name from dba_objects where object_id=73449; 现 在 可 知 锁 定 的 就 是 t1 表 OBJECT_NAME T1 LEO1@LEO1> select sid,event from v$session_wait where sid in (138,156); 从 会 话 等 待 视 图 上 也 可 以 看 出 138 阻 塞 了 156 会 话 SID EVENT ---- 138 SQL*Net message from client 156 enq: TX - row lock contention 156 会 话 由 于 TX 锁 争 用 原 因 导 致 hang 住 不 能 前 进,enq=enqueues 队 列 锁 小 结 : 我 们 在 了 解 锁 的 同 时, 也 要 在 业 务 设 计 的 流 程 上 尽 量 去 避 免 它 们 的 发 生, 比 如 说 2 个 人 的 工 作 没 有 协 调 好, 在 同 一 时 间 去 做 了 同 一 件 事, 这 就 有 可 能 产 生 锁 select...for update 锁 阻 塞 这 是 一 种 对 结 果 集 修 改 的 保 护 机 制 场 景 : 一 次 性 修 改 多 条 记 录 的 时 候 会 用 到 这 个 命 令, 起 到 锁 定 结 果 集 的 效 果, 这 也 是 结 果 集 修 改 引 起 的 阻 塞 LEO1@LEO1> select * from leo1.t1; ID 1 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 7

2 3 200 LEO1@LEO1> select * from leo1.t1 where id<=3 for update; 如 果 我 们 想 对 查 询 出 的 结 果 集 进 行 独 占, 并 且 此 时 不 允 许 其 他 会 话 进 行 修 改, 可 以 这 么 来 写 ID 1 2 3 138 TM 73449 0 3 0 0 138 TX 589839 915 6 0 0 这 3 行 记 录 都 已 经 被 TX 锁 锁 定 了, 在 没 有 提 交 之 前 别 人 不 能 修 改 LEO2@LEO1> update leo1.t1 set id=4 where id=1; LEO2@LEO1> update leo1.t1 set id=4 where id=2; LEO2@LEO1> update leo1.t1 set id=4 where id=3; 我 们 在 会 话 leo2 上 测 试 更 新 结 果 集 中 的 每 条 记 录, 都 会 hang 住 了 不 能 前 进, 说 明 这 个 结 果 集 已 经 整 体 被 锁 定 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73449 0 3 0 0 138 TX 589839 915 6 0 1 138 正 在 阻 塞 另 一 个 会 话 156 TM 73449 0 3 0 0 156 TX 589839 915 0 6 0 LEO1=138 会 话 LEO2=156 会 话, 我 们 可 以 看 出 138 会 话 阻 塞 156 会 话,156 会 话 TX 在 请 求 一 个 6 号 排 他 锁, 因 为 2 个 会 话 都 在 修 改 同 一 个 结 果 集 这 种 方 法 可 以 一 次 性 锁 定 n 行 记 录 重 点 : 一 个 表 上 只 能 有 一 个 6 号 锁 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 8

2 模 拟 RI 锁 定 导 致 阻 塞 的 场 景 分 享 知 识 收 获 快 乐 http://www.acoug.org LEO1@LEO1> create table a (id int primary key); a 是 主 表, 定 义 了 id 字 段 为 主 键 Table created. LEO1@LEO1> create table b (id references a(id)); b 是 从 表,id 字 段 是 引 用 主 表 的 id 字 段 Table created. LEO1@LEO1> insert into a values(1); 往 主 表 a 中 插 入 一 条 数 据 但 没 有 提 交, 事 务 没 有 结 束 会 产 生 锁 定 1 row created. 138 TM 73465 0 3 0 0 insert 由 于 有 从 属 关 系 因 此 会 在 2 个 表 上 都 加 3 号 共 享 锁 138 TM 73467 0 3 0 0 138 TX 196640 940 6 0 0 LEO1@LEO1> select object_name from dba_objects where object_id in (73465,73467); ID1 就 是 138 会 话 操 作 的 对 象 id, 我 们 会 在 主 表 和 从 表 上 都 加 上 表 级 锁 OBJECT_NAME A 73465 B 73467 LEO1@LEO1> commit; 提 交 之 后 释 放 锁 Commit complete. 锁 会 随 着 事 务 的 结 束 而 释 放 no rows selected LEO1@LEO1> select * from a; a 表 中 有 一 条 记 录 ID 1 LEO1@LEO1> select * from b; http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 9

no rows selected LEO1@LEO1> update a set id=100 where id=1; 主 表 a 上 更 新 了 一 条 记 录 1 row updated. 138 TM 73465 0 3 0 0 update 现 在 只 对 主 表 有 锁 定, 从 表 没 有 锁 定 138 TX 196634 941 6 0 0 LEO1@LEO1> commit; 提 交 之 后 释 放 锁 Commit complete. 现 在 没 有 锁 了 no rows selected LEO1@LEO1> select * from a; 主 表 里 的 值 已 经 更 新 了 ID 100 LEO1@LEO1> delete from a; 1 row deleted. 138 TM 73465 0 3 0 0 delete 也 是 只 对 主 表 有 锁 定, 从 表 没 有 锁 定 138 TX 655375 705 6 0 0 LEO1@LEO1> commit; 提 交 释 放 锁 Commit complete. no rows selected http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 10

LEO1@LEO1> insert into b values(2); insert into b values(2) * ERROR at line 1: ORA-02291: integrity constraint (LEO1.SYS_C0010831) violated - parent key not found 直 接 给 从 表 插 入 记 录, 如 果 主 表 没 有 的 话, 会 报 错 违 反 引 用 完 整 性 约 束, 没 有 主 表 依 据 LEO1@LEO1> insert into a values(2); 我 们 只 能 先 给 主 表 插 入 1 row created. LEO1@LEO1> insert into b values(2); 再 给 从 表 插 入 才 可 以, 因 为 从 表 的 数 据 必 须 在 主 表 里 先 存 在, 才 能 正 常 引 用 1 row created. LEO1@LEO1> select * from a; 主 表 有 了 ID 2 LEO1@LEO1> select * from b; 从 表 有 了 ID 2 LEO1@LEO1> select * from a; 主 表 有 3 ID 2 3 LEO1@LEO1> insert into b values(3); 才 能 给 从 表 插 入 1 row created. 138 TM 73465 0 3 0 0 从 表 的 insert 也 会 对 主 从 表 同 时 加 锁 138 TM 73467 0 3 0 0 138 TX 393246 939 6 0 0 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 11

LEO1@LEO1> select * from b; ID 2 3 LEO1@LEO1> commit; 释 放 锁 Commit complete. LEO1@LEO1> delete from b; 删 除 从 表 2 rows deleted. 138 TM 73465 0 3 0 0 从 表 delete 也 会 对 主 从 表 同 时 加 锁 138 TM 73467 0 3 0 0 138 TX 196620 944 6 0 0 LEO1@LEO1> commit; 释 放 锁 Commit complete. LEO1@LEO1> select * from a; 主 表 有 2 条 记 录 ID 2 3 LEO1@LEO1> select * from b; 从 表 没 有 记 录 no rows selected LEO1@LEO1> insert into a values(4); 向 主 表 插 入 1 条 记 录, 因 为 没 有 提 交 所 以 是 未 决 状 态 1 row created. http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 12

138 TM 73465 0 3 0 0 此 时 对 主 从 表 都 加 了 锁 定 138 TM 73467 0 3 0 0 138 TX 589834 937 6 0 0 LEO2@LEO1> insert into leo1.b values(4); 此 时 向 从 表 也 插 入 1 条 记 录, 由 于 从 表 的 数 据 必 须 引 用 自 主 表, 而 主 表 数 据 现 在 是 一 种 未 决 状 态, 所 以 hang 住 不 能 前 进 138 TM 73465 0 3 0 0 138 TM 73467 0 3 0 0 138 TX 589834 937 6 0 1 138 会 话 阻 塞 156 会 话, 这 个 6 代 表 已 经 插 入 成 功, 但 修 改 值 还 是 未 决 状 态 156 TM 73467 0 3 0 0 156 TM 73465 0 3 0 0 156 TX 393221 942 6 0 0 这 个 6 代 表 也 已 经 插 入 成 功, 但 修 改 值 还 是 未 决 状 态 156 TX 589834 937 0 4 0 主 从 表 插 入 后 产 生 了 2 个 TX 锁, 这 说 明 这 是 2 条 不 同 的 记 录,2 个 独 立 的 记 录, 不 是 争 用 同 一 条 记 录 小 结 : 之 所 以 还 有 一 个 TX 锁 正 在 申 请 4 号 锁, 是 因 为 2 条 记 录 的 修 改 值 都 是 未 决 状 态 违 反 了 引 用 完 整 性 约 束 从 而 产 生 阻 塞 导 致 156 会 话 hang 住 不 能 前 进 3 构 想 一 个 使 用 手 工 锁 定 解 决 一 种 业 务 需 求 的 场 景 场 景 : 手 工 锁 定 一 个 表, 例 如 我 们 在 做 一 个 秘 密 交 易 的 时 候, 谈 好 的 价 格 就 不 能 变 了, 必 须 一 手 交 钱 一 手 交 货 完 成 交 易, 为 了 保 证 价 格 安 全, 我 们 先 把 价 格 表 锁 定, 这 期 间 不 允 许 篡 改, 保 证 完 成 交 易 LEO1@LEO1> lock table t1 in share mode; 手 工 锁 定 一 个 表, 设 置 锁 的 级 别 为 4 Table(s) Locked. http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 13

138 TM 73449 0 4 0 0 已 经 在 T1 表 上 加 上 了 4 号 锁, 除 了 当 前 会 话 外 阻 塞 其 他 会 话 进 行 修 改 LEO2@LEO1> insert into leo1.t1 values(5); 我 们 在 会 话 leo2 上 插 入 一 条 记 录, 此 时 hang 住 了 不 动 了 138 TM 73449 0 4 0 1 156 TM 73449 0 0 3 0 这 就 是 由 于 我 们 加 了 4 号 锁 除 了 当 前 会 话 外 阻 塞 156 会 话 进 行 修 改,156 会 话 默 认 可 以 获 得 一 个 3 号 锁, 由 于 3 号 和 4 号 互 斥 不 能 共 存, 所 以 没 有 获 得 锁, 正 在 等 待 申 请 3 号 锁 LEO1@LEO1> commit; 锁 跟 着 事 务 的 结 束 而 释 放, commit rollback 都 行 此 时 没 有 锁 信 息 了 no rows selected 4 给 出 从 mode 2-6 的 TM 锁 相 互 间 的 互 斥 示 例 Oracle TM 锁 的 类 型 锁 模 式 锁 描 述 含 义 锁 定 表 的 SQL 0 None 1 Null 空, 本 模 式 是 oracle 预 留 模 式 2 Row Share(RS) 又 叫 (SS) 3 Row Exclusive Table Lock(RX) 又 叫 (SX) 行 级 共 享 锁, 是 限 制 最 少 的 TM 锁, 可 以 提 供 最 高 程 度 的 并 发 性 其 他 会 话 可 以 对 锁 定 的 表 进 行 任 何 类 型 的 DML 操 作, 还 可 以 与 其 他 会 话 锁 并 存 行 级 排 他 锁, 通 常 已 经 有 事 务 在 修 改 行 或 者 select for update 修 改 结 果 集 允 许 其 他 事 务 对 锁 定 的 表 进 行 select insert update delete 或 lock table 同 时 锁 定 一 张 表 Lock table t in row share mode; Lock table t in row exclusive mode; 4 Share Table 共 享 锁, 其 他 事 务 可 以 查 询 锁 定 的 表 但 不 能 Lock table t in share http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 14

Lock(S) 5 Share Row Exclusive Table Lock(SRX) 又 叫 SSX 6 Exclusive Table Lock (X) 分 享 知 识 收 获 快 乐 http://www.acoug.org 修 改, 只 允 许 当 前 事 务 修 改, 但 可 以 多 个 事 务 持 有 它 共 享 行 级 排 他 锁, 同 一 时 间 只 允 许 一 个 事 务 持 有 和 修 改 锁 定 的 表, 其 他 事 务 可 以 查 询 但 不 能 修 改 排 他 锁, 是 限 制 最 高 的 TM 锁, 禁 止 其 他 事 务 执 行 任 何 类 型 的 DML 语 句 或 者 锁 表 一 个 表 一 般 只 能 有 一 个 6 号 锁 mode; Lock table t in share row exclusive mode; Lock table t in exclusive mode; Oracle 锁 模 式 互 斥 关 系 图 锁 模 式 锁 名 称 允 许 级 别 互 斥 级 别 2 行 级 共 享 锁 2 3 4 5 6 3 行 级 排 他 锁 2 3 4 5 6 4 共 享 锁 2 4 3 5 6 5 共 享 行 级 排 他 锁 2 3 4 5 6 6 排 他 锁 2 3 4 5 6 实 验 锁 互 斥 准 备 工 作 LEO1@LEO1> select distinct sid from v$mystat; LEO1 用 户 的 会 话 id=138 SID -------- 138 LEO2@LEO1> select distinct sid from v$mystat; LEO2 用 户 的 会 话 id=156 SID -------- 156 LEO1@LEO1> create table lock1 (x int primary key); 创 建 lock1 表, 设 置 x 列 为 主 键 Table created. LEO1@LEO1> insert into lock1 values(1); 我 们 插 入 1 1 row created. http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 15

LEO1@LEO1> commit; 提 交 Commit complete. LEO1@LEO1> select * from lock1; 现 在 只 有 一 条 记 录, 并 且 没 有 锁 X -------- 1 no rows selected 行 级 共 享 锁 Row Share(RS) 2 LEO1@LEO1> lock table lock1 in row share mode; 把 lock1 表 设 置 为 行 级 共 享 锁 模 式 Table(s) Locked. 138 TM 73472 0 2 0 0 模 式 标 识 :2 LEO1@LEO1> select object_name from dba_objects where object_id=73472; lock1 表 对 象 id 为 73472 OBJECT_NAME LOCK1 LEO2@LEO1> insert into leo1.lock1 values(2); 1 row created. LEO2@LEO1> select * from leo1.lock1; http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 16

X 1 2 LEO2@LEO1> delete from leo1.lock1 where x=1; 1 row deleted. LEO2@LEO1> select * from leo1.lock1; X 2 LEO2@LEO1> update leo1.lock1 set x=10 where x=2; 1 row updated. LEO2@LEO1> select * from leo1.lock1; X 10 LEO2@LEO1> select * from leo1.lock1 for update; X -------- 10 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 17

---- ------ 138 TM 73472 0 2 0 0 156 TM 73472 0 3 0 0 156 TX 524321 936 6 0 0 小 结 : 行 级 共 享 锁, 是 限 制 最 少 的 TM 锁, 可 以 提 供 最 高 程 度 的 并 发 性 其 他 会 话 可 以 对 锁 定 的 表 进 行 任 何 类 型 的 DML 操 作, 还 可 以 与 其 他 会 话 锁 并 存 行 级 排 他 锁 Row Exclusive Table Lock(RX) 3 LEO1@LEO1> lock table leo1.lock1 in row exclusive mode; 把 lock1 表 设 置 为 行 级 排 他 锁 Table(s) Locked. 138 TM 73472 0 3 0 0 模 式 标 识 :3 3 级 锁 是 一 个 灵 活 性 比 较 大 的 锁,insert delete update 都 可 以 产 生 一 个 3 级 锁, 也 允 许 其 他 事 务 来 修 改 锁 定 的 表 LEO1@LEO1> select * from leo1.lock1; X ------- 10 20 30 40 50 会 话 27 LEO1@LEO1> update leo1.lock1 set x=100 where x=10; 1 row updated. LEO1@LEO1> select * from leo1.lock1; 已 经 被 修 改 了 X http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 18

-------- 20 30 40 50 100 会 话 156 LEO2@LEO1> insert into leo1.lock1 values(60); 也 已 经 插 入 了, 注 意 没 有 提 交 的 事 务 对 别 人 是 不 可 见 的 1 row created. LEO2@LEO1> select * from leo1.lock1; X ------- 10 20 30 40 50 60 会 话 146 LEO2@LEO1> delete from leo1.lock1 where x=20; 已 经 删 除 1 row deleted. LEO2@LEO1> select * from leo1.lock1; X 10 30 40 50 ------ 27 TM 73472 0 3 0 0 27 TX 327698 1144 6 0 0 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 19

138 TM 73472 0 3 0 0 146 TM 73472 0 3 0 0 146 TX 196626 975 6 0 0 156 TM 73472 0 3 0 0 156 TX 262163 782 6 0 0 大 家 都 是 共 存 的, 谁 也 没 有 阻 塞 谁,block 列 全 部 是 0 小 结 : 行 级 排 他 锁, 通 常 已 经 有 事 务 在 修 改 行 或 者 select for update 修 改 结 果 集 允 许 其 他 事 务 对 锁 定 的 表 进 行 select insert update delete 或 lock table 同 时 锁 定 一 张 表 共 享 锁 Share Table Lock(S) 4 LEO1@LEO1> select * from leo1.lock1; 还 是 有 5 条 记 录 X ------- 10 20 30 40 50 LEO1@LEO1> lock table leo1.lock1 in share mode; 把 lock1 表 设 置 为 共 享 锁 Table(s) Locked. ---- ------ 138 TM 73472 0 4 0 0 模 式 标 识 :4 4 级 锁 禁 止 其 他 会 话 对 锁 定 的 表 进 行 DML 操 作 但 可 以 select 查 询, 还 允 许 多 个 事 物 一 起 持 有 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 20

-------- 13 TM 73472 0 0 4 0 27 TM 73472 0 0 3 0 138 TM 73472 0 4 0 1 146 TM 73472 0 0 3 0 156 TM 73472 0 0 3 0 27 146 156 会 话 都 已 经 被 阻 塞 了, 有 的 朋 友 会 问 4 级 锁 可 以 和 4 级 锁 共 存 这 里 为 什 么 不 行 呢 呵 呵 因 为 有 3 级 锁 在 捣 乱,4 级 和 3 级 是 不 能 共 存 的, 所 以 我 们 把 所 有 的 3 级 锁 都 释 放 就 可 以 了, 我 们 来 看 一 下 13 TM 73472 0 4 0 0 27 TM 73472 0 2 0 0 138 TM 73472 0 4 0 0 现 在 4 级 锁 2 级 锁 都 可 以 同 时 存 在 了 小 结 : 共 享 锁, 其 他 事 务 可 以 查 询 锁 定 的 表 但 不 能 修 改, 只 允 许 当 前 事 务 修 改, 但 可 以 多 个 事 务 持 有 它 共 享 行 级 排 他 锁 Share Row Exclusive Table Lock(SRX) 5 LEO1@LEO1> lock table leo1.lock1 in share row exclusive mode; 把 lock1 表 设 置 为 共 享 行 级 排 他 锁 Table(s) Locked. -- ------ 138 TM 73472 0 5 0 0 模 式 标 识 :5 LEO1@LEO1> select object_name from dba_objects where object_id=73472; 现 在 锁 定 的 表 就 是 lock1 OBJECT_NAME http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 21

LOCK1 会 话 138 LEO1@LEO1> select * from leo1.lock1; 现 在 表 里 有 5 条 记 录, 我 们 看 看 其 他 会 话 能 不 能 修 改 表 X 10 20 30 40 50 会 话 156 LEO2@LEO1> insert into leo1.lock1 values(60); hang 住 了 不 能 够 前 进 说 明 被 阻 塞 会 话 27 LEO1@LEO1> update leo1.lock1 set x=100 where x=10; hang 住 了 不 能 够 前 进 说 明 被 阻 塞 会 话 146 LEO2@LEO1> delete from leo1.lock1 where x=20; hang 住 了 不 能 够 前 进 说 明 被 阻 塞 那 么 select for update 当 然 也 会 被 阻 塞 的, 我 们 来 看 看 其 他 事 务 能 不 能 查 询 呢! 会 话 23 LEO2@LEO1> select * from leo1.lock1; X --------- 10 20 30 40 50 --------- ------ 27 TM 73472 0 0 3 0 138 TM 73472 0 5 0 1 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 22

146 TM 73472 0 0 3 0 156 TM 73472 0 0 3 0 会 话 23 没 有 被 阻 塞 可 以 正 常 查 询 耶, 这 也 验 证 了 我 们 的 观 点, 读 操 作 不 会 被 任 何 事 务 阻 塞, 也 不 会 加 锁,27 146 156 会 话 3 个 行 级 排 他 锁 都 在 等 待 着 138 会 话 释 放 锁 --- ---- 13 TM 73472 0 2 0 0 138 TM 73472 0 5 0 0 会 话 13 的 2 级 锁 和 会 话 138 的 5 级 锁 可 以 共 存 符 合 我 们 的 锁 互 斥 关 系 小 结 : 共 享 行 级 排 他 锁, 同 一 时 间 只 允 许 一 个 事 务 持 有 和 修 改 锁 定 的 表, 其 他 事 务 可 以 查 询 但 不 能 修 改 排 他 锁 Exclusive Table Lock (X) 6 LEO1@LEO1> lock table leo1.lock1 in exclusive mode; 把 lock1 表 设 置 为 排 他 锁, 等 级 最 高 的 锁 Table(s) Locked. ---- 138 TM 73472 0 6 0 0 模 式 标 识 :6 会 话 156 LEO2@LEO1> insert into leo1.lock1 values(60); 会 话 27 LEO1@LEO1> update leo1.lock1 set x=100 where x=10; 会 话 146 LEO2@LEO1> delete from leo1.lock1 where x=20; 会 话 13 LEO2@LEO1> lock table leo1.lock1 in row share mode; 测 试 锁 互 斥 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 23

------ -------- 13 TM 73472 0 0 2 0 27 TM 73472 0 0 3 0 138 TM 73472 0 6 0 1 146 TM 73472 0 0 3 0 156 TM 73472 0 0 3 0 6 级 锁 会 阻 塞 除 了 自 己 外 的 所 有 会 话 的 事 务 并 且 排 斥 其 他 的 所 有 锁 模 式 连 2 级 锁 都 不 行, 是 最 高 限 制 的 TM 锁, 当 然 select 还 是 没 有 问 题 的 小 结 : 排 他 锁, 是 限 制 最 高 的 TM 锁, 禁 止 其 他 事 务 执 行 任 何 类 型 的 DML 语 句 或 者 锁 表 一 个 表 一 般 只 能 有 一 个 6 号 锁 5 给 出 一 个 导 致 死 锁 的 SQL 示 例 死 锁 定 义 : 从 广 义 上 讲 包 括 操 作 系 统 应 用 程 序 数 据 库, 如 果 2 个 进 程 ( 会 话 ) 相 互 持 有 对 方 的 资 源, 都 一 直 等 待 对 方 释 放, 这 种 情 况 会 造 成 死 锁 误 解 : 会 话 的 阻 塞 可 不 是 死 锁, 因 为 其 中 有 一 个 会 话 还 是 可 以 继 续 操 作 的 释 放 :Oracle 会 自 动 检 测 死 锁 并 强 制 干 预 释 放 LEO1@LEO1> create table p1 ( x int primary key ); 我 们 新 建 一 个 p1 表, 设 置 x 字 段 为 主 键 Table created. LEO1@LEO1> insert into leo1.p1 values(10); 138 会 话 插 入 的 是 10 1 row created. LEO2@LEO1> insert into leo1.p1 values(20); 156 会 话 插 入 的 是 20 1 row created. 138 TM 73470 0 3 0 0 138 TX 327713 1124 6 0 0 138 有 一 个 TX 排 他 锁, 但 当 前 没 有 阻 塞 会 话 156 TM 73470 0 3 0 0 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 24

156 TX 589825 945 6 0 0 156 也 有 一 个 TX 排 他 锁, 但 当 前 也 没 有 阻 塞 会 话 LEO1@LEO1> select object_name from dba_objects where object_id=73470; 看 p1 表 上 存 在 正 常 的 TM TX 锁, 都 没 有 阻 塞 到 对 方 的 会 话 OBJECT_NAME P1 LEO1@LEO1> insert into leo1.p1 values(20); 此 时 我 在 138 会 话 上 再 插 入 20, 发 现 hang 住 了 不 能 前 进, 这 是 什 么 原 因 呢? 我 们 看 看 v$lock 视 图 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73470 0 3 0 0 138 TX 589825 945 0 4 0 这 时 138 会 话 就 继 续 插 入 了, 但 这 个 插 入 动 作 是 成 功 的 没 有 阻 塞, 而 是 由 于 138 156 会 话 修 改 值 的 相 同 138 TX 327713 1124 6 0 0 违 反 了 主 键 约 束 从 而 产 生 阻 塞, 实 际 是 对 修 改 值 的 相 同 产 生 了 阻 塞, 所 以 申 请 的 是 4 级 锁, 而 非 6 级 锁 156 TM 73470 0 3 0 0 156 TX 589825 945 6 0 1 156 会 话 此 时 正 在 阻 塞 138 会 话, 因 为 156 会 话 的 事 务 还 没 有 完 成 还 是 一 个 未 决 状 态 LEO2@LEO1> insert into leo1.p1 values(10); 我 在 156 会 话 上 也 插 入 10, 这 时 死 锁 的 效 果 就 出 来 了 SID TY ID1 ID2 LMODE REQUEST BLOCK -- 138 TM 73470 0 3 0 0 138 TX 327713 1124 6 0 1 138 会 话 此 时 正 在 阻 塞 156 会 话, 因 为 138 会 话 的 事 务 还 没 有 完 成 还 是 一 个 未 决 状 态 156 TM 73470 0 3 0 0 156 TX 327713 1124 0 4 0 实 际 上 是 对 修 改 值 的 相 同 产 生 了 阻 塞,156 会 话 正 在 申 请 4 级 锁 156 TX 589825 945 6 0 0 LEO1@LEO1> insert into leo1.p1 values(20); 我 们 看 一 下 138 会 话 报 错,Oracle 自 动 检 测 死 锁 并 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 25

强 制 干 预 释 放 insert into leo1.p1 values(20) * ERROR at line 1: ORA-00060: deadlock detected while waiting for resource( 等 待 资 源 时 检 测 到 死 锁 -> 释 放 之 ) 这 时 请 注 意 一 下, 只 是 释 放 掉 了 第 一 个 锁 定, 但 第 二 个 锁 定 还 在 等 待, 所 以 我 们 要 手 工 释 放 6 总 结 Ø 总 结 : 上 面 讲 到 了 好 几 种 锁 的 机 制, 我 们 崇 尚 的 思 想 就 是 先 要 想 一 想 为 什 么 会 出 现 锁, 不 出 现 行 不 行, 锁 的 作 用 有 哪 些, 这 种 启 发 式 的 思 路 能 够 让 我 们 记 忆 深 刻 Ø LOCK 作 用 : 独 占 业 务 资 源 保 证 读 一 致 性 维 护 事 务 完 整 性 Ø LOCK 宗 旨 : 没 有 并 发 就 没 有 锁, 一 个 人 操 作 数 据 库 是 不 会 产 生 锁 的 Leonarding 2012.11.28 天 津 &winter 分 享 技 术 ~ 成 就 梦 想 Blog:www.leonarding.com Leonarding 的 个 人 简 介 刘 盛, 英 文 名 Leonarding 现 任 中 国 征 信 中 心 (PBCCRC) 高 级 数 据 架 构 师, 负 责 金 融 征 信 项 目 基 础 架 构 数 据 建 模 设 备 选 型 解 决 方 案 曾 任 职 于 中 国 联 通 天 津 公 司 网 管 中 心 DBA, 参 与 设 计 联 通 分 组 网 信 令 监 控 系 统, 运 维 TB 级 海 量 数 据 库 项 目 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 26

天 津 大 学 计 算 机 科 学 与 技 术 硕 士 本 人 具 有 丰 富 Oracle 管 理 经 验 和 项 目 设 计 经 验, 擅 长 大 型 数 据 库 架 构 设 计 与 建 模 性 能 调 优 故 障 诊 断 及 高 可 用 容 灾 技 术 喜 欢 专 研 各 种 数 据 库 (Mysql/SybaseIQ/Hbase/Redis/Memcache/Cassandra) 原 理 及 应 用 场 景 对 大 数 据 的 采 集 处 理 整 合 利 用 具 有 独 到 见 解 撰 写 了 大 量 数 据 库 & 数 据 分 析 原 创 文 章, 荣 获 2012&2013 年 度 ITPUB 最 佳 技 术 原 创 精 华 奖 乐 于 参 加 各 种 行 业 会 议 交 流, 提 倡 分 享 技 术 ~ 成 就 梦 想 理 念 timer shaft: 2009 Redhat RHCE 2010 Oracle10g OCP 2012 Oracle10g OCM 2013 ACOUG Core Member 2013 年 被 提 名 为 DATAGURU Oracle 数 据 库 与 大 数 据 解 决 方 案 版 版 主 2013 年 被 提 名 为 ITPUB HADOOP 版 版 主 技 术 博 客 Blog:www.leonarding.com 新 浪 微 博 :@itpub_leonarding Email: leonarding@yeah.net MSN: lsls1984@hotmail.com QQ: 40354446 I a DBA,Also a consultant,also a lecturer 面 朝 大 海 春 暖 花 开 http://www.acoug.org 实 力 成 就 稳 健 技 术 创 造 价 值 27