这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。 我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...

关于主外键表数据提交过程中的一点疑惑

上一篇 / 下一篇  2008-01-11 00:18:35 / 个人分类:数 据 库

查看( 37 ) / 评论( 26 )
关于主外键表数据提交过程中的一点疑惑
4`Z yN2@.gs0
-o_d*h$na8bOM}F0一直有疑问,Oracle是基于事务的,事务内的所有操作必须一次性提交,要么成功要么失败。
[:c7]*o_!I0建了一张简单的主表和引用表,如果分开插入数据并提交当然是没问题的,问题就在于放在一个事务内去提交的话,假设主表先插数据,但是应该还没有写入到数据库中,然后再引用表中再插入数据,为什么能够一次性提交成功或者失败呢?还没有写到主表中,当然写引用表的时候会缺乏关联关系啊,不过事实上已经成功了
D-lRC!]mL0ITPUB个人空间JR/v SL{ X O
还有类似的操作ITPUB个人空间 w5`9~!e/b:Q8Elj
例如ITPUB个人空间5g'a iJ.p*E%FH$|
Insert into temptable select 1 from onetable;ITPUB个人空间x"m~Ni&h~0A(Hp.y3@
Insert into temptable select count(*) from temptable;
` TJ5EGqW0事实上已经按照顺序写入了
5h;bdH2pKwj0
-- Create tableITPUB个人空间z;_3RfNi%]\4RFk"Yx
create table ChildTable
CPw:WTL|7?uT0(ITPUB个人空间\/hJW8`/Y

? @r0MH8o)O'Ko-z%|0ID number(20,0),ITPUB个人空间z8jp*L6\
ITPUB个人空间2|J(tt,@;U

!{,b#W!L4r,F'Z b6B0Name Varchar2(20)

U3O RGx0);
o6u'n?0[!X0-- Create/Recreate primary, unique and foreign key constraints
'x&z5Yg:qGmJ0alter table ChildTableITPUB个人空间,W3g(AOh
ITPUB个人空间2t_G9XVv
add constraint ChildTablePrimarykey primary key (ID);
ITPUB个人空间&@WBgJ7K

Y(Y$d"wh1|%X V7O0-- Create table
2u5cu0Sp"|6f2X0create table MainTableITPUB个人空间 Z{@1}'N%b1k
(
:_6s7\)tW0
C,D(@7~z0ID number(20,0),
ITPUB个人空间S-gY7{]+wf:q O
ITPUB个人空间e~;K.q#?*[
ForeignID number(20,0),
ITPUB个人空间.T5t m^ \'a:W
ITPUB个人空间z \Zh4X
Name Varchar2(20)
ITPUB个人空间 ]'[3n*iop
);ITPUB个人空间gd['?7H
-- Create/Recreate primary, unique and foreign key constraintsITPUB个人空间8?.C`K0D(`^
alter table MainTableITPUB个人空间]2|!CG*u~ _h@7_
ITPUB个人空间`&BdY&s$N z1z [
add constraint MainTablePrimarykey primary key (ID);
ITPUB个人空间5s W%I+| v.x
-- Create/Recreate primary, unique and foreign key constraintsITPUB个人空间L|QJZ} tAXy
alter table MAINTABLE
ka6Y9q p-Ma0ITPUB个人空间6?;Yx#D{_#l%p
add constraint MainTableForeignKEY foreign key (ForeignID)

T? }#^8sY(k4_0
0e G#h5iB(opl1_0references ChildTable (ID);

5q;Q%f#w1v$RI9le0ITPUB个人空间+o*jK]vitg5S

s*[ J v&@c{z DT0INSERT INTO ChildTable VALUES(1,'ChildA');
f3b#t ~ n0COMMIT;
h lY [-]%u0INSERT INTO MainTable VALUES(1,1,'MainA');ITPUB个人空间B?$vz)H"]V
COMMIT;ITPUB个人空间:A/eezn-Id0Q

F GV ]0r0-- Created on 2008-1-9 by bq_wangITPUB个人空间*J diZWs Y
BEGIN
!Y2KPUfm9X:e'g9x0ITPUB个人空间8wa(|:ob,tP*zY-k
-- Test statements here

8U(\ E ~4gW9_lI0K0ITPUB个人空间B(p5UdGw0s$CA^
SAVEPOINT do_insert;

g O I!vT b#K0ITPUB个人空间6h:H^Op~d
INSERT INTO ChildTable VALUES(2,'ChildA');

n+s2_iw%M4L!V0ITPUB个人空间P c)l3R r)r
INSERT INTO MainTable VALUES(2,2,'MainA');

7Xx~&w y {[8F#`A0ITPUB个人空间/s f'z8Lr!y r1s{8L|%Z
COMMIT WORK ;

x7R;|5@j'Cb0EXCEPTIONITPUB个人空间&|1c I#@D

'Mv-L!T8zw6t ]0WHEN OTHERS THEN

J^3E5Nby(i[0
fZ&L,H,@0ROLLBACK TO do_insert;
5A{z{#U$P9^5P0
ITPUB个人空间 R3V#^4lB J(S

Gn'eyh'oD)]0DBMS_OUTPUT.put_line('ERROR');
ITPUB个人空间:C8_2~`{.cz QY
END;ITPUB个人空间i!v8iYzHR6X1@`

TAG:

春暖花开 tolywang 发布于2008-01-10 08:18:25
TX锁 space.itpub.netEt$U by~D6m

!M,yL
@ KR8Uspace.itpub.net
在 parent key 所在的table中插入数据,不提交,使用sys用户看不到数据插入,不过使用这个表所在的用户登入似乎可以看到数据 。
不胜人生一场醉 bq_wang 发布于2008-01-10 08:23:46
同一个表的东西是不是也是这样
R;l/pobv~Z6rInsert into temptable select 1 from onetable;
(Gp;C!T wiDiInsert into temptable select count(*) from temptable;
wangfans的个人空间 wangfans 发布于2008-01-10 09:44:33
我的理解是,ITPUB个人空间b
~P-y3s_

!q1QyK'JD?c
主表lookup子表查找refrence key的时候,肯定是lookup了包括还在缓冲区里面的脏数据。"z|:CL]
证明:space.itpub.net2Qd{Y2|)W

?u;G        bCJSQL>  INSERT INTO ChildTable VALUES(3,'ChildA');ITPUB个人空间;F.I)@$_/p bbH
m


jc3z#xd}ITPUB个人空间1 row created.X{F1sPju'x#Z(B7s|
^ o        ~q1F7z

a9LLw"[~

这个时候还没有写入数据文件,只是在缓冲区里面。
G4PPIPG6k7N0~.ys.eI HgL
SQL> INSERT INTO MainTable VALUES(3,3,'MainA');ITPUB个人空间VoZ,i        R]
w


G BX\Y;TW1 row created.ITPUB个人空间,h2NUq]|S
P2~u"j

`4uM{r
为什么能找到关系键,应该扫面了缓冲区。
棉花糖ONE发布于2008-01-10 09:59:35
你的这东西和一种情况类似
lL J#W7oU,sITPUB个人空间
X
V4U7VX*|oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
insert into table values(1);oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netp0NYt2}7K h)?A
假设session 1执行了这个语句,那么对于session 1这个会话来说,1是可见的space.itpub.net%J.K{7@u-j
但是对于别的session来说1是不可见
不胜人生一场醉 bq_wang 发布于2008-01-10 20:23:22
有没有什么具体的机制和理论介绍啊
不胜人生一场醉 bq_wang 发布于2008-01-10 20:30:47
我的问题在于这两个表有主外键约束,为什么没写入基础表之前引用表就能写入了
yanggq的个人空间 yanggq 发布于2008-01-10 20:43:20
1.一致读,_ Ky1cz9WHEg}
2.子表(引用的表)的引用字段可以为空
yanggq的个人空间 yanggq 发布于2008-01-10 20:43:48
3.还有deffer constraint.
不胜人生一场醉 bq_wang 发布于2008-01-10 20:48:51
好像你说的也不成立啊,你可以试试看直接插入那张引用表,肯定是通不过的
yanggq的个人空间 yanggq 发布于2008-01-10 20:51:04
你的表怎么定义的?还有constraint如何定义的?还有session的设置?
不胜人生一场醉 bq_wang 发布于2008-01-10 20:55:51
就是个主表和外键表啊,没什么特别的吧,session是默认的
)R4[b(sw/L]oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netf
d^^G"C[i

好像很久之前就有些疑惑,一直不敢确认是否保险
yanggq的个人空间 yanggq 发布于2008-01-10 21:01:24
数据在一个transcation中是可以看的到的,你可以看看oracle concept中关于事务和read consistent的那一章,我找找
不胜人生一场醉 bq_wang 发布于2008-01-10 21:04:16
OK,我也找找看,难道我对事务的理解有问题
yanggq的个人空间 yanggq 发布于2008-01-10 21:07:27
multi-version
yanggq的个人空间 yanggq 发布于2008-01-10 21:14:39
http://download.oracle.com/docs/ ... 0/consist.htm#i5338
admincy的个人空间 admincy 发布于2008-01-10 21:21:49

QUOTE:

原帖由 tolywang 于 2008-1-10 08:18 发表 space.itpub.net$s,?,]O*^z$o$yj&O
TX锁 space.itpub.net*n5n\M!a;f

Z$RG:o&l6R7r在 parent key 所在的table中插入数据,不提交,使用sys用户看不到数据插入,不过使用这个表所在的用户登入似乎可以看到数据 。
1\n{-eK2dspace.itpub.netKI
yP;|P[M

不提交的话需在同一个session中才能看得到
admincy的个人空间 admincy 发布于2008-01-10 21:26:41
读的一致性,在同一事务中所读的是同一个版本的表数据
不胜人生一场醉 bq_wang 发布于2008-01-10 22:48:07
看完了,不过好像糊里糊涂的  Multiversion Concurrency ControlOracle automatically provides read consistency to a query so that all the data that the query sees comes from a single point in time (statement-level read consistency). Oracle can also provide read consistency to all of the queries in a transaction (transaction-level read consistency). H*w        U'^MU@
Oracle uses the information maintained in its rollback segments to provide these consistent views. The rollback segments contain the old values of data that have been changed by uncommitted or recently committed transactions. Figure 13-1 shows how Oracle provides statement-level read consistency using data in rollback segments.
D]/v PT/a;g-YzITPUB个人空间Figure 13-1 Transactions and Read Consistencyoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net-q)]5D7v4U0e:V ^#u z
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net7|Z4U_s
Description of "Figure 13-1 Transactions and Read Consistency"
-Y?!M
u5b2`3y&[;tspace.itpub.net

8Y"R&O_&T1g*G
3N2gX"h mITPUB个人空间As a query enters the execution stage, the current system change number (SCN) is determined. In Figure 13-1, this system change number is 10023. As data blocks are read on behalf of the query, only blocks written with the observed SCN are used. Blocks with changed data (more recent SCNs) are reconstructed from data in the rollback segments, and the reconstructed data is returned for the query. Therefore, each query returns all committed data with respect to the SCN recorded at the time that query execution began. Changes of other transactions that occur during a query's execution are not observed, guaranteeing that consistent data is returned for each query.
cc59的个人空间 cc59 发布于2008-01-10 23:55:56

QUOTE:

原帖由 tolywang 于 2008-1-10 08:18 发表
lz-w*M3a

TX锁 |@.q6P0H1r~
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.nety&Q6]
_!L

在 parent key 所在的table中插入数据,不提交,使用sys用户看不到数据插入,不过使用这个表所在的用户登入似乎可以看到数据 。
[a8m"]!r:FITPUB个人空间不会的,除非你在sqlplus中设置自动提交了.
u_LN8B6e~u9i
:Xi$By6EW否则在不同的会话不可能能够看到不提交的数据
yangtingkun的个人空间 yangtingkun 发布于2008-01-11 00:10:46

QUOTE:

原帖由 cc59 于 2008-1-10 23:55 发表
R
OoR4I9u![oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

l^ a| bKk\"COITPUB个人空间不会的,除非你在sqlplus中设置自动提交了.ITPUB个人空间'?4Q"}/tD
sO8V-{
eN|P

否则在不同的会话不可能能够看到不提交的数据
ITPUB个人空间8yI4H qg k
space.itpub.netUe%o^a}
常规方法是无法实现脏读的,但是也不是没有办法。
不胜人生一场醉 bq_wang 发布于2008-01-11 00:13:21
CC59这厮在上海居然不去年会,我准备明天晚上在车厢里办个DBA大PK呢
yangtingkun的个人空间 yangtingkun 发布于2008-01-11 00:14:29

QUOTE:

原帖由 bq_wang 于 2008-1-9 23:52 发表
        E5l/y!Ke(a ^'?oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net关于主外键表数据提交过程中的一点疑惑
&clyF3i8W3Ko b"m2V{(qW
一直有疑问,Oracle是基于事务的,事务内的所有操作必须一次性提交,要么成功要么失败。#q4@Q4a
WG

建了一张简单的主表和引用表,如果分开插入数据并提交当然是没问题的,问题就在于放在一个事务内去提交的话,假设主表先插数据,但是应该还没有写入到数据库中,然后再引用表中再插入数据,为什么能够一次性提交成功或者失败呢? 还没有写到主表中,当然写引用表的时候会缺乏关联关系啊,不过事实上已经成功了
^J4^r1YT ?lwITPUB个人空间 ^ R
['~G&XI

还有类似的操作ITPUB个人空间~?M1sZV*J-I
例如!O4m A0d'Y
Insert into temptable select 1 from onetable;ITPUB个人空间6G2mj2jx/~#kc2i
Insert into temptable select count(*) from temptable;space.itpub.netC1fApC;S8A+NxIT
事实上已经按照顺序写入了S*sR;eV

N;|%V9RnQ%^(M0y-- Create table/k._p+{q8F8[3\?
create table ChildTableoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net#d(q8j$h/i*lb
(
+Rnw&k)`;pspace.itpub.net
&t7r0ipOID number(20,0),](F,tv"~;uY6Dx

7L` tf)B&ON;Bzspace.itpub.net]4B9u)ik"Y
Name Varchar2(20)
_E|3X7Zspace.itpub.net);oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net-G(~ Bw"i(Is}3D
-- Create/Recreate primary, unique and foreign key constraints
[6j!b$O,Q.nF7boracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netalter table ChildTable
([
Cp*a-_F
w9g

hJ%a?
JO-Nspace.itpub.net
add constraint ChildTablePrimarykey primary key (ID);
6f[:fq/jvX space.itpub.nett]_)Rbg)z8c
-- Create tablespace.itpub.netD,]P5H+n4t
R1N

create table MainTable
1ul9@1h~.WX(@p)]R,E_$xK
space.itpub.netp1|:k#kAU\
ID number(20,0),joq}V!v!X0F:i#]%E


F5OW^q[c @gBz;{
ForeignID number(20,0),U5O5}+K?$V

zKT%V(@I2~Name Varchar2(20)y)CVzp
);        EC%_8Wj]3e2K
-- Create/Recreate primary, unique and foreign key constraints
.n1t[#t7y}5k/BITPUB个人空间alter table MainTableex)w6?9X7AL0]Sfo

N/d"o/D-`D%padd constraint MainTablePrimarykey primary key (ID);
znT,eqVpm-- Create/Recreate primary, unique and foreign key constraints
9^A(FR.R3s-_(w UITPUB个人空间alter table MAINTABLEBVbYj!P

:E6Ano7yB `'\uITPUB个人空间add constraint MainTableForeignKEY foreign key (ForeignID)IHG0B+|        B`"D

^MI(eq4^5joracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netreferences ChildTable (ID);oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netIg4j%Z g!T%T
ITPUB个人空间"_i L-B;t~M'wU/|

^:W        mrCDPjINSERT INTO ChildTable VALUES(1,'ChildA');ITPUB个人空间#I `Ez9W#l
vb |

COMMIT;ITPUB个人空间"Z)z$g        B[
U+Mu{Q

INSERT INTO MainTable VALUES(1,1,'MainA');oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net\,F5Yn%c\9d:uy
COMMIT;
:N#um2yn;zE
Koracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
nt%v%_KH tQ
-- Created on 2008-1-9 by bq_wangITPUB个人空间tu*D['E,d
BEGINuw)jxj
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5M\T(i^'f)az
-- Test statements here
Tl `0sN{1rITPUB个人空间eA7OJ(c2c4jEa
SAVEPOINT do_insert;o^ ?L J/Pg-Y J:o
lH@X Q)f8NV
INSERT INTO ChildTable VALUES(2,'ChildA');
^+afW"~ |c
Wlcspace.itpub.net

j8D3X9q[;Q

INSERT INTO MainTable VALUES(2,2,'MainA');
E$xM"sm)vNspace.itpub.net
l Yi;Z9nq:HITPUB个人空间COMMIT WORK ;
?"\
tvLPITPUB个人空间
EXCEPTIONoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netG DO]N^3q
,m2P3fD*lo
WHEN OTHERS THEN
4D@&Y B5U$l\1A&AITPUB个人空间)K%T!i9@
T

ROLLBACK TO do_insert;
R4I c5itN,J[4R*C9U.i4i
JB


ljjW$^#fN"UB$IGspace.itpub.netDBMS_OUTPUT.put_line('ERROR');
0daAbr$Z0JEND;bU c;u9X*mjJ
l/g#@

  
&Ee&Z,A#JD

5Cu1Y;vGs_oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net即使没有提交,修改也会写到数据文件中(当然,可能由于LAZY WRITE的原因,数据块仍然在内存中还没有被写到数据文件中,不过这也没有关系,这个block在内存中还是在磁盘中没有区别),因此对于当前事务而言,主表记录已经存在,那么子表的记录为什么不能插入呢?
春暖花开 tolywang 发布于2008-01-11 08:16:57

QUOTE:

原帖由 cc59 于 2008-1-10 23:55 发表
[4Qix2ZZb#WEITPUB个人空间
Z0VKs\        f'I](ispace.itpub.net不会的,除非你在sqlplus中设置自动提交了.
*G1x _2v._5Ia
5{l K)S$Z^%|oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net否则在不同的会话不可能能够看到不提交的数据
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netm9p#Xrk

        cc ?k-\\oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netspace.itpub.net}+vJubB;^
  是的, 同一个transaction
andyxu发布于2008-01-11 08:30:37
同一个transaction中能看到本身更新或者insert的数据,而其他的则看不到。。。
-G        a%g
j/e6yF8Uspace.itpub.net
|2vN Q'z-N4@P#Sh
这里问一下,存储过程的递归调用,如果失败是否全部回滚所有已调用的存储过程?
yangtingkun的个人空间 yangtingkun 发布于2008-01-11 09:14:18

QUOTE:

原帖由 andyxu 于 2008-1-11 08:30 发表
A?2~~xKf同一个transaction中能看到本身更新或者insert的数据,而其他的则看不到。。。 J ]tH1j:y+xMhq

C"cV!x5IR3QITPUB个人空间这里问一下,存储过程的递归调用,如果失败是否全部回滚所有已调用的存储过程?
space.itpub.net`/^&NQ5H?B]
"bXJ@1]$T5O/I@
如果你调用的所有存储过程都不包含COMMIT的话(包括显式和隐含两种)
cc59的个人空间 cc59 发布于2008-01-11 13:37:44

QUOTE:

原帖由 bq_wang 于 2008-1-11 00:13 发表 #}.A'^'r0mx-sQ:Z#o
CC59这厮在上海居然不去年会,我准备明天晚上在车厢里办个DBA大PK呢
"w
?J&pOoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
我的计划出现失误了.要不然也去的.唉!
我来说两句

(可选)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 22535
  • 日志数: 65
  • 建立时间: 2007-12-07
  • 更新时间: 2008-08-31

RSS订阅

Open Toolbar