﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-漂在爪洼岛上-文章分类-Database</title><link>http://www.blogjava.net/zhoujingxian/category/42590.html</link><description>Java is my life,but not all!</description><language>zh-cn</language><lastBuildDate>Wed, 04 Nov 2009 08:59:50 GMT</lastBuildDate><pubDate>Wed, 04 Nov 2009 08:59:50 GMT</pubDate><ttl>60</ttl><item><title>Oracle事务知识要点 </title><link>http://www.blogjava.net/zhoujingxian/articles/Oracle_transcation.html</link><dc:creator>周竞先</dc:creator><author>周竞先</author><pubDate>Wed, 04 Nov 2009 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhoujingxian/articles/Oracle_transcation.html</guid><wfw:comment>http://www.blogjava.net/zhoujingxian/comments/301034.html</wfw:comment><comments>http://www.blogjava.net/zhoujingxian/articles/Oracle_transcation.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoujingxian/comments/commentRss/301034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoujingxian/services/trackbacks/301034.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: Verdana"><strong style="color: red">1.事务隔离</strong><br />
<br />
①一个未提交的事务所做的修改不能被其它事务所看到。只有当事务提交成功后，在该事务之后执行的其它事务才可能看到该事务所做的改变。
<p>②在该事务提交之前已经执行了一部分而另一部分在该事务提交后执行的剩余部分同样也看不到该事务做出的改变。这是另一个Oracle特性：读一致和快照。</p>
<p>③在该事务提交同时进行的其它事务同样也看不到该事务所做的改变。<br />
<br />
<strong style="color: #ff0000">2.语句级回滚<br />
<br />
</strong>①当一个SQL语句在执行期间因为发生的任何错误而中断时，将产生一个&#8220;语句级回滚&#8221;。该回滚的后果就像这个SQL语句根本没有执行过一样。<br />
<br />
②注意回滚是发生在&#8220;执行&#8221;阶段的，如果是在SQL语句的解析阶段因为语法问题而无法执行。因为没有产生任何影响而不会出现&#8220;回滚&#8221;。<br />
<br />
<strong style="color: #ff0000">3.事务控制的分割</strong><br />
<br />
如果一个事务中包含了DML语句和DDL语句，那么该事务会被分解成多个事务。首先在DDL之前的所有DML语句会被作为一个事务而一次性提交。<span style="background-color: yellow">然后Oracle会为这个DDL创建一个新的，单语句的事务。</span>如果DDL语句执行失败了，那么DML事务依然成功。<span style="color: #ff0000"><br />
<br />
<strong>4.不同情况下的事务控制</strong></span><br />
<br />
请注意：用户从Oracle服务器断开连接和用户进程强行中断的后果是不同的。&nbsp;<br />
<br />
①前者典型的例子是Oracle服务器关闭或重启，此时所有未提交事务会被提交。<br />
<br />
②后者典型的例子用户通过进程管理器强行kill掉进程，此时所有未提交事务所做的操作被回滚。<br />
<br />
<strong style="color: #ff0000">5.事务提交前要做的事情</strong><br />
<br />
Oracle提交一个事务之前，必须做以下几件事情：&nbsp;<br />
<br />
<span style="background-color: yellow">①记住数据被修改前是什么样子的<br />
</span><br />
<span style="background-color: yellow">②记住数据即将要被改成什么样子<br />
</span><br />
<span style="background-color: yellow">③记住redo log和undo log的关联</span><br />
<br />
<span style="background-color: yellow">④将SGA中已读取到内存的数据修改为新的值(此时并未真正保存到数据文件)</span> </p>
<p>其中第一步是通过在undo表空间中记录undo日志来完成的。第二步、第三步是通过向SGA中的redo日志缓冲区写记录来完成的。这样当事务回滚时就可以从redo日志找到对应的undo日志，从而找回之前的数据</p>
<p>★要特别注意的是：此时不一定会触发DBWn进程。</p>
<p>★要特别注意的另一个地方是：第2步记录事务操作的改变是内存中进行的，还未写到磁盘上的redo日志文件<br />
<br />
<strong style="color: #ff0000">6.事务提交时所做的事情<br />
<br />
</strong><span style="background-color: yellow">①记录SCN值(System Change Number)</span><br />
<br />
<span style="background-color: yellow">②将在线重做日志记录(位于SGA的redo日志缓冲区中)持久化到redo日志文件</span><br />
<br />
<span style="background-color: yellow">③Oracle释放资源和锁<br />
</span><br />
<span style="background-color: yellow">④Oracle将事务标记为已结束<br />
</span><br />
注意：只有在commit指令被发出后，才会将SGA中重做日志缓冲区的内容刷新到磁盘的redo日志文件。在LGWR进程执行前，重做日志一直存在于内存中，也被称为在线重做日志。<br />
<br />
<strong style="color: red">7.savepoint回滚和整个事务的回滚</strong><br />
<br />
注意当Oracle事务回滚到某个savepoint时，在savepoint之后的所有后续savepoint将失效。但此时Transaction还是活跃且可继续的。这一点不同于整个事务的回滚。<br />
<br />
<strong style="color: #ff0000">8.自治事务</strong><br />
<br />
从传统上来说，一个事务只有在完整执行成功或回滚之后，才会进行下一个事务。而自治事务允许在一个事务中调用运行另一个事务，被调用事务执行完成后，调用事务继续执行之前未完成的操作直至事务结束<br />
<br />
自治事务在被调用后，将和外围事务完全独立。彼此之间并不共享任何资源或者锁，外围事务所有未提交的改变对自治事务来说都是不可见。自治事务提交后外围事务将可以看到改变。</span> </p>
<br />
<br />
<font style="font-size: 10pt; color: red; font-family: Verdana" size="3"><span style="color: #3366ff"><font style="font-size: 10pt; font-family: Verdana" size="3">-------------------------------------------------------------</font></span><br />
<span style="color: #ff0000"><font style="font-size: 10pt; font-family: Verdana" size="3"><strong>生活就像打牌，不是要抓一手好牌，而是要尽力打好一手烂牌。</strong></font> </span></font>
 <img src ="http://www.blogjava.net/zhoujingxian/aggbug/301034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoujingxian/" target="_blank">周竞先</a> 2009-11-04 13:12 <a href="http://www.blogjava.net/zhoujingxian/articles/Oracle_transcation.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>