<!-- /* Font Definitions */ @font-face {font-family:"MS 明朝"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS Mincho"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"MS ゴシック"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS Gothic"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:Century; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"/@SimSun"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@MS 明朝"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:"MS Pゴシック"; panose-1:2 11 6 0 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:"/@MS Pゴシック"; panose-1:2 11 6 0 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:"/@MS ゴシック"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0mm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:Century; mso-fareast-font-family:"MS 明朝"; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} pre {margin:0mm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"MS ゴシック"; mso-bidi-font-family:"MS ゴシック";} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:99.25pt 30.0mm 30.0mm 30.0mm; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:18.0pt;} div.Section1 {page:Section1;} -->
statement: 一个 SQL 语 句。
session: 一个由 ORACLE 用 户产 生的 连 接,一个用 户 可以 产 生多个 SESSION ,但相互之 间 是独立的。
transaction: 所有的改 变 都可以划分到 transaction 里,一个 transaction 包含一个或多个 SQL 。当一个 SESSION 建立的 时 候就是一个 TRANSACTION 开 始的 时 刻,此后 transaction 的 开 始和 结 束由 DCL 控制,也就是 每 个 COMMIT/ROLLBACK 都 标 示着一个 transaction 的 结 束。
consistency :是 对 于 statement 级别 而不是 transaction 级别 来 说 的。 sql statement 得到的数据都是以 sql statement 开 始的 IMAGE 。
LOCK 的基本情况:
update, insert ,delete, select ... for update 会 LOCK 相 应 的 ROW 。
只有一个 TRANSACTION 可以 LOCK 相 应 的行,也就是 说 如果一个 ROW 已 经 LOCKED 了,那就不能被其他 TRANSACTION 所 LOCK 了。
LOCK 由 statement 产 生但却由 TRANSACTION 结 尾( commit , rollback ),也就是 说 一个 SQL 完成后 LOCK 还 会存在,只有在 COMMIT/ROLLBACK 后才会 RELEASE 。
SELECT.... FOR UPDATE [OF cols] [NOWAIT]; |
前面的 FOR UPDATE 省略,下面我 们 来 讲 一下 OF 。
transaction A 运行 |
则 transaction B 可以 对 b 表 wwm3 的相 应 行 进 行 DML 操作 , 但不能 对 a 表 wwm2 相 应 行 进 行 DML 操作 .
反一下看看。
transaction A 运行 |
则 transaction B 可以 对 a 表 wwm2 的相 应 行 进 行 DML 操作 , 但不能 对 b 表 wwm3 相 应 行 进 行 DML 操作 .
也就是 说 LOCK 的 还 是行 , 只是如果不加 OF 的 话 会 对 所有 涉 及的表 LOCK 的 , 加了 OF 后只会 LOCK OF 字句所在的 TABLE.
NOWAIT (如果一定要用 FOR UPDATE ,我更建 议 加上 NOWAIT )
当有 LOCK 冲突 时 会提示 错误 并 结 束 STATEMENT 而不是在那里等待 . 返回 错误 是 "ORA-00054: resource busy and acquire with NOWAIT specified"
另外如下用法也 值 得推荐, 应该 酌情考 虑 使用。
FOR UPDATE WAIT 5 |
5 秒后会出 现 提示:
ORA-30006: resource busy; acquire with WAIT timeout expired |
出 现 提示:
no rows selected |
同 样 也是在 transaction 结 束 时 才会 释 放 lock 。
DEADLOCK:
transaction a lock rowA , then transaction b lock rowB |
也 就是 说 两个 transaction 都相互 试图 去 lock 对 方已 经 lock 的 ROW ,都在等待 对 方 释 放自己的 lock , 这样 就使死 锁 。另外, deadlock 也会有 600 提示。
使用 说 明
Select…For Update 语 句的 语 法与 select 语 句相同,只是在 select 语 句的后面加 FOR UPDATE [NOWAIT] 子句。
该语 句用来 锁 定特定的行(如果有 where 子句,就是 满 足 where 条件的那些行)。当 这 些行被 锁 定后,其他会 话 可以 选择这 些行,但不能更改或 删 除 这 些行,直到 该语 句的事 务 被 commit 语 句或 rollback 语 句 结 束 为 止。
如 图 20.51 所示,左上角的会 话 用 Select…For Update 语 句 锁 定了 Department 表中 DeptNo='01' 的行,右上角的会 话说 明其他会 话 不可以 继续 更改 该 行上的数据。从 OEM 中的 锁 的信 息可以看出, Select…For Update 语 句所加的 锁 与 update 语 句所加的 锁 相同:一个行 级别 的 EXCLUSIVE 锁 ( 说 明多个事 务 不能同 时 操作同一行)、一个表 级别 的 ROW EXCLUSIVE 锁 。
图 20.51 Select…For Update 语 句 锁 定了符合 where 条件的行
如 图 20.52 所示,左上角的会 话 用 Update 语 句 锁 定了 Department 表中 DeptNo='01' 的行,右上角的会 话说 明其他会 话 不可以用 Select…For Update 语 句 继续锁 定 该 行。
图 20.52 Select…For Update 语 句被其他会 话 阻塞了
如 图 20.53 所示,左上角的会 话 用 Update 语 句 锁 定了 Department 表中 DeptNo='01' 的行,右上角的会 话说 明其他会 话 不可以用 Select…For Update NOWAIT 语 句 继续锁 定 该 行,且会立即返回一个 错误 提示 “ORA-00054: 资 源正忙 , 但指定以 NOWAIT 方式 获 取 资 源 ” ,而不需要等待加 锁 成功。
图 20.53 如果加 锁 不成功, 则 Select…For Update NOWAIT 语 句就会立即返回 错误 提示
可 以看出,如果 仅仅 用 update 语 句来更改数据 时 ,可能会因 为 加不上 锁 而没有响 应 地、莫名其妙地等待,但如果在此之前,先用 Select…For Update NOWAIT 语 句将要更改的数据 试 探性地加 锁 ,就可以通 过 立即返回的 错误 提示而明白其中的道理,或 许这 就是 For Update 和 NOWAIT 的意 义 之所在。
你不会是在一个批 处 理中建立多个表吧,比如
create table 1
.....
create table 2
.....
create table 3
.....
....
go
最后才出个 go ?
不建 议 批 处 理 这样 写。
根据我的理解你可能是:你 每 次 执 行的 时 候都是按 f5 或上面那个 绿 色小三角, 这样 的 话 你的 查询 分析器中的所以 语 句都要 执 行,而 这 代 码 的一部分前面你已 经执 行 过 了,是不是?
你可以用鼠 标选 中你要 执 行的 语 句,然后按 f5 或上面的那个 绿 色小三角
至于有外 键约 束的表 删 除不了,你可以 删 除外 键约 束,
sp_help 表名字
查 看外 键约 束的名字,然后 删 除
drop 外 键约 束名字
把表建立在 master 数据 库 中,你可以 这样
select name from sysobjects where type='u'
-- 查 看 master 数据 库 中的表,如果你确 实 把表建立在 这 个数据 库 中了。 执 行下面
drop 表名字