﻿<?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-Todd-随笔分类-DB</title><link>http://www.blogjava.net/Todd/category/41637.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 24 Jul 2012 20:37:25 GMT</lastBuildDate><pubDate>Tue, 24 Jul 2012 20:37:25 GMT</pubDate><ttl>60</ttl><item><title>【oracle】高并发量表更新注意点</title><link>http://www.blogjava.net/Todd/archive/2012/07/25/383896.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Tue, 24 Jul 2012 18:29:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2012/07/25/383896.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/383896.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2012/07/25/383896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/383896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/383896.html</trackback:ping><description><![CDATA[移动一个业务高并发，接入一个客户电话就发一个特殊邀请码（码为字符加数字混编，无规律），码已存表，业务上要 码和用户手机号码一一对应；<br />
所以，来个用户就得对未标记的码更新手机号码；高并发时，行锁及等待比较耗时，导致数据库性能下降严重；<br />
解决办法，<br />
码表增加seqid,字段；导入数据时使用rownum,做该字段值,建索引；<br />
更新时，使用序列，
<div></div>
<div>CREATE SEQUENCE SQ_U_SEQ INCREMENT BY 1 START WITH 1 MAXVALUE 50000000 CYCLE CACHE 2000 NOORDER;<br />
更新则：update ... where ... and t.seqid =&nbsp;SQ_U_SEQ.nextval ...;<br />
以后有新的数据要导入，则序列需重置，则：</div>
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">create</span>&nbsp;<span style="color: #808080; ">or</span>&nbsp;<span style="color: #FF00FF; ">replace</span>&nbsp;<span style="color: #0000FF; ">procedure</span>&nbsp;seq_reset(v_seqname&nbsp;<span style="font-weight: bold; ">varchar2</span>)&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;n&nbsp;<span style="font-weight: bold; ">number</span>(<span style="color: #800000; font-weight: bold; ">10</span>);<br />
tsql&nbsp;<span style="font-weight: bold; ">varchar2</span>(<span style="color: #800000; font-weight: bold; ">100</span>);<br />
&nbsp;<span style="color: #0000FF; ">begin</span><br />
&nbsp;<span style="color: #0000FF; ">execute</span>&nbsp;immediate&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">select&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>v_seqname<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">.nextval&nbsp;from&nbsp;dual</span><span style="color: #FF0000; ">'</span>&nbsp;<span style="color: #0000FF; ">into</span>&nbsp;n;<br />
&nbsp;&nbsp;n:<span style="color: #808080; ">=-</span>(n<span style="color: #808080; ">-</span><span style="color: #800000; font-weight: bold; ">1</span>);<br />
&nbsp;&nbsp;tsql:<span style="color: #808080; ">=</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">alter&nbsp;sequence&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>v_seqname<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">&nbsp;increment&nbsp;by&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>&nbsp;n;<br />
&nbsp;&nbsp;<span style="color: #0000FF; ">execute</span>&nbsp;immediate&nbsp;tsql;<br />
&nbsp;<span style="color: #0000FF; ">execute</span>&nbsp;immediate&nbsp;<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">select&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>v_seqname<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">.nextval&nbsp;from&nbsp;dual</span><span style="color: #FF0000; ">'</span>&nbsp;<span style="color: #0000FF; ">into</span>&nbsp;n;<br />
&nbsp;&nbsp;tsql:<span style="color: #808080; ">=</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">alter&nbsp;sequence&nbsp;</span><span style="color: #FF0000; ">'</span><span style="color: #808080; ">||</span>v_seqname<span style="color: #808080; ">||</span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">&nbsp;increment&nbsp;by&nbsp;1</span><span style="color: #FF0000; ">'</span>;<br />
&nbsp;<span style="color: #0000FF; ">execute</span>&nbsp;immediate&nbsp;tsql;<br />
&nbsp;<span style="color: #0000FF; ">end</span>&nbsp;seq_reset;</div>
另外，高并发时序列的cache要设置大点,一般业务设置100以上，但nocache的时候性能确实很差，最大相差20倍．
排序参数：oracle默认是NOORDER，如果设置为ORDER；在单实例环境没有影响，在RAC环境此时，多实例实际缓存相同的序列，此时在多个实例并发取该序列的时候，会有短暂的资源竞争来在多实例之间进行同步。因次性能相比noorder要差，所以RAC环境非必须的情况下不要使用ORDER，尤其要避免NOCACHE   ORDER组合；
<img src ="http://www.blogjava.net/Todd/aggbug/383896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2012-07-25 02:29 <a href="http://www.blogjava.net/Todd/archive/2012/07/25/383896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle JOB问题解决步骤【转】</title><link>http://www.blogjava.net/Todd/archive/2011/09/21/359115.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Tue, 20 Sep 2011 18:49:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2011/09/21/359115.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/359115.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2011/09/21/359115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/359115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/359115.html</trackback:ping><description><![CDATA[<p><strong><font color="#00ff00">一。job的运行频率设置</font></strong></p>
<p>1.每天固定时间运行，比如早上8:10分钟：Trunc(Sysdate+1) + (8*60+10)/24*60</p>
<p>2.Toad中提供的：</p>
<p>每天：trunc(sysdate)+1</p>
<p>每周：trunc(sysdate)+7</p>
<p>每月：trunc(sysdate)+30</p>
<p>每个星期日：next_day(trunc(sysdate),'SUNDAY')</p>
<p>每天6点：trunc(sysdate)+1+6/24</p>
<p>半个小时：sysdate+30/1440</p>
<p>3.每个小时的第15分钟运行，比如：8:15，9:15，10:15...：trunc(sysdate,'hh')+75/1440。原先我设置的是trunc(sysdate,'hh')+15/1440，发现居然不行。</p>
<p><strong><font color="#00ff00">二。JOB为什么不运行？</font></strong></p>
<p>1.先来了解一下JOB的参数说明：与job相关的参数一个是job_queue_processes，这个是运行JOB时候所起的进程数，当然系统里面JOB大于这个数值后，就会有排队等候的，最小值是0，表示不运行JOB，最大值是36，在OS上对应的进程时SNPn，9i以后OS上管理JOB的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。</p>
<p>select * from v$bgprocess，这个paddr不为空的snp/cjq进程就是目前空闲的进程，有的表示正在工作的进程。</p>
<p>另外一个是job_queue_interval，范围在1--3600之间，单位是秒，这个是唤醒JOB的process，因为每次snp运行完他就休息了，需要定期唤醒他，这个值不能太小，太小会影响数据库的性能。</p>
<p>2.诊断：先确定上面这两个参数设置是否正确，特别是第一个参数，设置为0了，所有JOB就不会跑，确认无误后，我们继续向下。</p>
<p>3.使用下面的SQL察看JOB的的broken,last_date和next_date，last_date是指最近一次job运行成功的结束时间，next_date是根据设置的频率计算的下次执行时间，根据这个信息就可以判断JOB上次是否正常，还可以判断下次的时间对不对，SQL如下：</p>
<p>select * from dba_jobs</p>
<p>有时候我们发现他的next_date是4000年1月1日，说明job要不就是在running，要不就是状态是break(broken=Y)，如果发现JOB的broken值为Y，找用户了解一下，确定该JOB是否可以broken，如果不能broken，那就把broken值修改成N，修改再使用上面的SQL察看就发现他的last_date已经变了，JOB即可正常运行，修改broken状态的SQL如下：</p>
<p>&nbsp;declare </p>
<p>BEGIN </p>
<p>DBMS_JOB.BROKEN(&lt;JOB_ID&gt;,FALSE); </p>
<p>END; </p>
<p>4.使用下面的SQL查询是否JOB还在Running</p>
<p>select * from dba_jobs_running</p>
<p>如果发现JOB已经Run了很久了还没有结束，就要查原因了。一般的JOB running时会锁定相关的相关的资源，可以查看一下v$access和v$locked_object这两个view，如果发现其他进程锁定了与JOB相关的Object，包括PKG/Function/Procedure/Table等资源，那么就要把其他进程删除，有必要的话，把JOB的进程也删除，再重新跑看看结果。</p>
<p>5.如果上面都正常，但是JOB还不run，怎么办？那我们要考虑把JOB进程重启一次，防止是SNP进程死了造成JOB不跑，指令如下：</p>
<p>alter system set job_queue_processes=0 --关闭job进程，等待5--10秒钟</p>
<p>alter system set job_quene_processes=5 --恢复原来的值</p>
<p>6.Oracle的BUG</p>
<p>Oracle9i里面有一个BUG，当计数器到497天时，刚好达到它的最大值，再计数就会变成-1，继续计数就变成0了，然后计数器将不再跑了。如果碰到这种情况就得重启数据库，我们这边有一个生产型的数据库版本是9205，就发生过这样一次问题，后来和用户约时间重启后就没问题了。但是其他的Oracle7345和Oracle8i的数据库没有发现这个问题。</p>
<p>7.数据库上的检查基本上就这多，如果JOB运行还有问题，那需要配合用户察看一下是否是程序本身的问题，比如处理的资料量大，或者网络速度慢等造成运行时过长，那就需要具体情况具体分析了。我们可以通过下面的SQL手工执行一下JOB看看：</p>
<p>declare </p>
<p>begin</p>
<p>dbms_job.run(&lt;job&gt;_ID)</p>
<p>end;</p>
<p>如果发现JOB执行不正常，就要结合程序具体分析一下。</p> <img src ="http://www.blogjava.net/Todd/aggbug/359115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2011-09-21 02:49 <a href="http://www.blogjava.net/Todd/archive/2011/09/21/359115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]linux 启动 oracle</title><link>http://www.blogjava.net/Todd/archive/2011/04/18/348494.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Mon, 18 Apr 2011 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2011/04/18/348494.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/348494.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2011/04/18/348494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/348494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/348494.html</trackback:ping><description><![CDATA[<p>启动数据库实例，分为两步：第一步，启动监听；第二步，启动数据库实例。<br />
&nbsp;<wbr><br />
一、如何启动数据库实例<br />
&nbsp;<wbr>&nbsp;<wbr> 1.进入到sqlplus启动实例<br />
[oracle@redhat ~]$ su - oracle&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;切换到oracle用户&#8221;<br />
Password:<br />
[oracle@redhat ~]$ lsnrctl start&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;打开监听&#8221;<br />
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 14-OCT-2009 19:06:40<br />
Copyright (c) 1991, 2005, Oracle.&nbsp;<wbr> All rights reserved.<br />
Starting /home/oracle/product/10g/bin/tnslsnr: please wait...<br />
TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
System parameter file is /home/oracle/product/10g/network/admin/listener.ora<br />
Log messages written to /home/oracle/product/10g/network/log/listener.log<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC2)))<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat)(PORT=1522)))<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC2)))<br />
STATUS of the LISTENER<br />
------------------------<br />
Alias&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LISTENER<br />
Version&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
Start Date&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 14-OCT-2009 19:06:40<br />
Uptime&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 days 0 hr. 0 min. 0 sec<br />
Trace Level&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> off<br />
Security&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ON: Local OS Authentication<br />
SNMP&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> OFF<br />
Listener Parameter File&nbsp;<wbr>&nbsp;<wbr> /home/oracle/product/10g/network/admin/listener.ora<br />
Listener Log File&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> /home/oracle/product/10g/network/log/listener.log<br />
Listening Endpoints Summary...<br />
&nbsp;<wbr> (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC2)))<br />
&nbsp;<wbr> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat)(PORT=1522)))<br />
Services Summary...<br />
Service "PLSExtProc" has 1 instance(s).<br />
&nbsp;<wbr> Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...<br />
The command completed successfully<br />
[oracle@redhat ~]$ sqlplus /nolog&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;进入到sqlplus&#8221;<br />
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Oct 14 19:06:45 2009<br />
Copyright (c) 1982, 2005, Oracle.&nbsp;<wbr> All rights reserved.<br />
SQL&gt; conn /as sysdba&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;连接到sysdba&#8221;<br />
Connected to an idle instance.<br />
SQL&gt; startup&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;启动数据库实例&#8221;<br />
ORACLE instance started.<br />
Total System Global Area&nbsp;<wbr> 285212672 bytes<br />
Fixed Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1218968 bytes<br />
Variable Size&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 88082024 bytes<br />
Database Buffers&nbsp;<wbr>&nbsp;<wbr> 188743680 bytes<br />
Redo Buffers&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 7168000 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; shutdown immediate&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;关闭数据库实例&#8221;<br />
Database closed.<br />
Database dismounted.<br />
ORACLE instance shut down.<br />
SQL&gt; exit<br />
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production<br />
With the Partitioning, OLAP and Data Mining options<br />
[oracle@redhat ~]$ lsnrctl stop&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;关闭监听&#8221;<br />
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 14-OCT-2009 19:08:06<br />
Copyright (c) 1991, 2005, Oracle.&nbsp;<wbr> All rights reserved.<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC2)))<br />
The command completed successfully<br />
&nbsp;<wbr><br />
&nbsp;<wbr>&nbsp;<wbr> 2.用dbstart和dbshut启动和关闭数据库实例<br />
&nbsp;<wbr><br />
先启动监听 lsnrctl start<br />
启动实例&nbsp;<wbr> dbstart<br />
&nbsp;<wbr><br />
使用dbstart命令启动数据库比较方便，但是在linux上安装好oracle之后，第一次使用dbstart命令可能会报如下错误：<br />
&nbsp;<wbr><br />
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener<br />
Usage: /u01/app/oracle/oracle/product/10.2.0/db_1/bin/dbstart ORACLE_HOME</p>
<p>原因：<br />
dbstart和dbshut脚本文件中ORACLE_HOME_LISTNER的设置有问题，分别打开两个文件找到：用vi编辑dbstart，ORACLE_HOME_LISTNER=$1,修改为<br />
ORACLE_HOME_LISTNER=$ORACLE_HOME<br />
&nbsp;<wbr><br />
&nbsp;<wbr><br />
然后保存退出，此时再运行dbstart，已经不报错了，但是没有任何反应，ps一下进程，没有oracle的进程，说明oracle实例没有正常启动。<br />
&nbsp;<wbr><br />
此时的原因是在/etc/oratab的设置问题，我们vi一下，发现<br />
zgz:/home/oracle/product/10g:N<br />
最后设置的是"N"（我的环境中只有一个实例，因此只有一行配置语句），我们需要把&#8220;N&#8221;修改为&#8220;Y&#8221;。<br />
&nbsp;<wbr><br />
以上的工作做好之后，dbstart就可以正常使用了：<br />
&nbsp;<wbr><br />
[oracle@redhat bin]$ lsnrctl start&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;启动监听&#8221;<br />
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 14-OCT-2009 19:44:53<br />
Copyright (c) 1991, 2005, Oracle.&nbsp;<wbr> All rights reserved.<br />
Starting /home/oracle/product/10g/bin/tnslsnr: please wait...<br />
TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
System parameter file is /home/oracle/product/10g/network/admin/listener.ora<br />
Log messages written to /home/oracle/product/10g/network/log/listener.log<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC2)))<br />
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat)(PORT=1522)))<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC2)))<br />
STATUS of the LISTENER<br />
------------------------<br />
Alias&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> LISTENER<br />
Version&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> TNSLSNR for Linux: Version 10.2.0.1.0 - Production<br />
Start Date&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 14-OCT-2009 19:44:53<br />
Uptime&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0 days 0 hr. 0 min. 0 sec<br />
Trace Level&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> off<br />
Security&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ON: Local OS Authentication<br />
SNMP&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> OFF<br />
Listener Parameter File&nbsp;<wbr>&nbsp;<wbr> /home/oracle/product/10g/network/admin/listener.ora<br />
Listener Log File&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> /home/oracle/product/10g/network/log/listener.log<br />
Listening Endpoints Summary...<br />
&nbsp;<wbr> (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC2)))<br />
&nbsp;<wbr> (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat)(PORT=1522)))<br />
Services Summary...<br />
Service "PLSExtProc" has 1 instance(s).<br />
&nbsp;<wbr> Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...<br />
The command completed successfully<br />
[oracle@redhat bin]$ dbstart&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;启动数据库实例&#8221;<br />
Processing Database instance "zgz": log file /home/oracle/product/10g/startup.log<br />
[oracle@redhat bin]$ dbshut&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;关闭数据库实例&#8221;<br />
[oracle@redhat bin]$ lsnrctl stop&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> --&#8220;关闭监听&#8221;<br />
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 14-OCT-2009 19:45:33<br />
Copyright (c) 1991, 2005, Oracle.&nbsp;<wbr> All rights reserved.<br />
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC2)))<br />
The command completed successfully<br />
&nbsp;<wbr><br />
二、如何使数据库实例和linux系统一起启动<br />
在/etc/rc.d/rc.local中加入如下语句即可实现同系统启动实例：<br />
su - oracle -c "lsnrctl start"<br />
su - oracle -c "dbstart"&nbsp;<br />
<br />
<br />
<wbr><br />
</p>
<img src ="http://www.blogjava.net/Todd/aggbug/348494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2011-04-18 16:05 <a href="http://www.blogjava.net/Todd/archive/2011/04/18/348494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]ORACLE的隔离级别</title><link>http://www.blogjava.net/Todd/archive/2011/04/15/348360.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Fri, 15 Apr 2011 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2011/04/15/348360.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/348360.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2011/04/15/348360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/348360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/348360.html</trackback:ping><description><![CDATA[<p><strong><span style="font-family: 宋体">隔离级别（isolation level）</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">隔离级别定义了事务与事务之间的隔离程度。</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">隔离级别与并发性是互为矛盾的：隔离程度越高，数据库的并发性越差；隔离程度越低，数据库的并发性越好。</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ANSI/ISO SQL92</span><span style="font-family: 宋体">标准定义了一些数据库操作的隔离级别：</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">未提交读（read uncommitted）</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">提交读（read committed）</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">重复读（repeatable read）</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">序列化（serializable）</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">通过一些现象，可以反映出隔离级别的效果。这些现象有：</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">更新丢失（lost update）：当系统允许两个事务同时更新同一数据是，发生更新丢失。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">脏读（dirty read）：当一个事务读取另一个事务尚未提交的修改时，产生脏读。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">非重复读（nonrepeatable read）：同一查询在同一事务中多次进行，由于其他提交事务所做的修改或删除，每次返回不同的结果集，此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data.&nbsp; )</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">幻像（phantom read）：同一查询在同一事务中多次进行，由于其他提交事务所做的插入操作，每次返回不同的结果集，此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition.&nbsp; )</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">下面是隔离级别及其对应的可能出现或不可能出现的现象</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148"></td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Dirty Read&nbsp; </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">NonRepeatable Read&nbsp; </span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Phantom Read&nbsp; </span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Read uncommitted</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Read committed</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Repeatable read</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Possible</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Serializable</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 110.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="148">
            <p><span style="font-family: 宋体">Not possible</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong><span style="font-family: 宋体">ORACLE</span></strong><strong><span style="font-family: 宋体">的隔离级别</span></strong></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ORACLE</span><span style="font-family: 宋体">提供了SQL92标准中的read committed和serializable，同时提供了非SQL92标准的read-only。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">read committed</span><span style="font-family: 宋体">：</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">这是ORACLE缺省的事务隔离级别。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">事务中的每一条语句都遵从语句级的读一致性。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">保证不会脏读；但可能出现非重复读和幻像。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">serializable</span><span style="font-family: 宋体">：</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">简单地说，serializable就是使事务看起来象是一个接着一个地顺序地执行。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">保证不会出现非重复读和幻像。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">Serializable</span><span style="font-family: 宋体">隔离级别提供了read-only事务所提供的读一致性（事务级的读一致性），同时又允许DML操作。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交，则serializable事务不会读到这些变更，因此发生无法序列化访问的错误。（换一种解释方法：只要在serializable事务开始到结束之间有其他事务对serializable事务要修改的东西进行了修改并提交了修改，则发生无法序列化访问的错误。）</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">If a serializable transaction contains data manipulation language (DML) that attempts to update any resource that may have been updated in a transaction uncommitted at the start of the serializable transaction, </span><span style="font-family: 宋体">（并且修改在后来被提交而没有回滚），then the DML statement fails. 返回的错误是ORA-08177: Cannot serialize access for this transaction。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="color: red; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ORACLE</span><span style="font-family: 宋体">在数据块中记录<u>最近对数据行执行修改操作的N个事务</u>的信息，目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文：Oracle permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began. To make this determination efficiently, Oracle uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under some circumstances, Oracle may have insufficient history information to determine whether a row has been updated by a "too recent" transaction. This can occur when many transactions concurrently modify the same data block, or do so in a very short period. You can avoid this situation by setting higher values of INITRANS for tables that will experience many transactions updating the same blocks. Doing so will enable Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. </span></p>
<p style="margin-left: 78.5pt; text-indent: -21.25pt"><span style="color: red; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">The INITRANS Parameter</span><span style="font-family: 宋体">：Oracle stores control information in each data block to manage access by concurrent transactions. Therefore, if you set the transaction isolation level to serializable, you must use the ALTER TABLE command to set INITRANS to at least 3. This parameter will cause Oracle to allocate sufficient storage in each block to record the history of recent transactions that accessed the block. Higher values should be used for tables that will undergo many transactions updating the same blocks. </span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">read-only</span><span style="font-family: 宋体">：</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">遵从事务级的读一致性，仅仅能看见在本事务开始前由其它事务提交的更改。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">不允许在本事务中进行DML操作。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">read only</span><span style="font-family: 宋体">是serializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读；而在serializable中可以进行DML操作。</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">Export with CONSISTENT = Y sets the transaction to read-only.</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">read committed</span><span style="font-family: 宋体">和serializable的区别和联系：</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">事务1先于事务2开始，并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚，则事务2（不论是read committed还是serializable方式）进行它想要做的修改。如果事务1提交，则当事务2是read committed方式时，进行它想要做的修改；当事务2是serializable方式时，失败并报错&#8220;Cannot serialize access&#8221;，<span style="color: red">因为事务2看不见事务1提交的修改，且事务2想在事务一修改的基础上再做修改</span>。具体见英文：Both read committed and serializable transactions use row-level locking, and both will wait if they try to change a row updated by an uncommitted concurrent transaction. The second transaction that tries to update a given row waits for the other transaction to commit or roll back and release its lock. If that other transaction rolls back, the waiting transaction (regardless of its isolation mode) can proceed to change the previously locked row, as if the other transaction had not existed. However, if the other (blocking) transaction commits and releases its locks, a read committed transaction proceeds with its intended update. A serializable transaction, however, fails with the error "Cannot serialize access", because the other transaction has committed a change that was made since the serializable transaction began. </span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">read committed</span><span style="font-family: 宋体">和serializable可以在ORACLE并行服务器中使用。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">关于SET TRANSACTION READ WRITE：read write和read committed 应该是一样的。在读方面，它们都避免了脏读，但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致，但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中，如果遇到待锁定资源无法锁定，应该是等待而不是放弃。这与read committed一致。</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">语句级的读一致性</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ORACLE</span><span style="font-family: 宋体">保证语句级的读一致性，即一个语句所处理的数据集是在单一时间点上的数据集，这个时间点是这个语句开始的时间。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">一个语句看不见在它开始执行后提交的修改。</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">对于DML语句，它看不见由自己所做的修改，即DML语句看见的是它本身开始执行以前存在的数据。</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">事务级的读一致性</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">事务级的读一致性保证了可重复读，并保证不会出现幻像。</span></p>
<p style="margin-left: 21.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">设置隔离级别</span></p>
<p style="margin-left: 42.5pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">设置一个事务的隔离级别</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">SET TRANSACTION ISOLATION LEVEL READ COMMITTED; </span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; </span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">SET TRANSACTION READ ONLY; </span></p>
<p style="margin-left: 42.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">设置增个会话的隔离级别</span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE; </span></p>
<p style="margin-left: 57.25pt; text-indent: -21.25pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED; </span></p>
 <img src ="http://www.blogjava.net/Todd/aggbug/348360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2011-04-15 16:15 <a href="http://www.blogjava.net/Todd/archive/2011/04/15/348360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql事务隔离级别以及有问题的读取（脏读，不可重复读，幻象读）</title><link>http://www.blogjava.net/Todd/archive/2010/09/11/331745.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Sat, 11 Sep 2010 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/Todd/archive/2010/09/11/331745.html</guid><wfw:comment>http://www.blogjava.net/Todd/comments/331745.html</wfw:comment><comments>http://www.blogjava.net/Todd/archive/2010/09/11/331745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Todd/comments/commentRss/331745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Todd/services/trackbacks/331745.html</trackback:ping><description><![CDATA[
		<p>1.事务里一些有问题的读取：脏读，不可重复读，幻象读</p>
		<p>脏读 （dirty read）事务T1更新了一行记录的内容，但是并没有提交所做的修改。事务T2读取更新后的行，然后T1执行回滚操作，取消了刚才所做的修改。现在T2所读取的行就无效了。</p>
		<p>不可重复读取 （nonrepeatable read）事务T1读取一行记录，紧接着事务T2修改 了T1刚才读取的那一行记录。然后T1又再次读取这行记录，发现与刚才读取的结果不同。这就称为“不可重复”读，因为T1原来读取的那行记录已经发生了变化。</p>
		<p>幻像读取 （phantom read）事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录，这行记录恰好可以满足T1所使用的查询条件中的WHERE 子句的条件。然后T1又使用相同的查询再次对表进行检索，但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”，因为对T1来说这一行就像突 然出现的一样。</p>
		<p>2.事务的隔离级别</p>
		<p>从级别低到高依次为：</p>
		<p>READ UNCOMMITTED 幻像读、不可重复读和脏读都允许。</p>
		<p>READ COMMITTED 允许幻像读、不可重复读，但不允许脏读。</p>
		<p>REPEATABLE READ 允许幻像读，但不允许不可重复读和脏读。InnoDB默认级别 </p>
		<p>SERIALIZABLE 幻像读、不可重复读和脏读都不允许。</p>
		<p>但是InnoDB的可重复读隔离级别和其他数据库的可重复读是有区别的，不会造成幻象读（phantom read）。</p>
		<p>ORACLE数据库支持 READ COMMITTED 和 SERIALIZABLE ，不支持 READ UNCOMMITTED 和 REPEATABLE READ 。</p>
		<p>3.测试：</p>
		<p>1）并发更新 ，表tab1 的一条记录id=1 num=1，两个session分别执行事务1，2</p>
		<p>分别输入下面的语句</p>
		<p>事务1 (session1) ：</p>
		<p>           start transaction;</p>
		<p>           update tab1 set num=num+1 where id=1；</p>
		<p>=========</p>
		<p>一条记录被更新，select发现num=2;</p>
		<p>事务2 (session2)：</p>
		<p>           start transaction;</p>
		<p>           update tab1 set num=num+1 where id=1;</p>
		<p>=========</p>
		<p>事务2会被阻塞，然后session1输入commit;提交事务1。此时事务2更新成功。</p>
		<p>session1 select一下会发现num还是2（不允许脏读 ）；session2 select 一下 num 为3（update可以得到最新提交过的数据然后更新，但是如果没有update，一直是select 的话select得到的num一直是1 ），然后commit；</p>
		<p>session1 select 发现num为3 ，session2 select 发现num为3；</p>
		<p>所以，事务中update是有行写锁（排他锁）的，不会发生： 脏读和不可重复读（对于自身有update的事务，update之后是可以读到最新数据的，这属于例外？^_^ ），</p>
		<p>2）关于幻象读 ，innodb默认事务隔离级别是不会出现的；摘自网上，测试通过：</p>
		<p>mysql&gt; set autocommit=off;<br />Query OK, 0 rows affected (0.00 sec)</p>
		<p>session 1 创建表并插入测试数据</p>
		<p>mysql&gt; create table test(i int) engine=innodb;<br />Query OK, 0 rows affected (0.00 sec)</p>
		<p>mysql&gt; insert into test values(1);<br />Query OK, 1 row affected (0.00 sec)<br />session 2 查询，没有数据，正常，session1没有提交，不允许脏读</p>
		<p>mysql&gt; select * from test;<br />Empty set (0.00 sec)<br />session 1 提交事务</p>
		<p>mysql&gt; commit;<br />Query OK, 0 rows affected (0.00 sec)<br />session 2 查询，还是没有数据，没有产生幻象读</p>
		<p>mysql&gt; select * from test;<br />Empty set (0.00 sec)<br />4.最后，现在应该知道数据库并发控制并不复杂，交给数据库的事务就行，mysql 选用innodb引擎，不会出现：“不可重复读”（就是在事务1进行数据修改的时候，事务2读取的数据是没修改 之前的数据，事务1提交的时候，事务2再次读取的时候得到的是修改后的数据，单个事务内所读数据不一致），“脏读”，“幻象读”；</p>
		<p> 关于innodb锁机制的详细解释，参见《mysql手册》-“15.2.10 .  InnoDB 事务模型和锁定”。 </p>
		<p>
				<br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/todd_liu/archive/2010/09/10/5875650.aspx">http://blog.csdn.net/todd_liu/archive/2010/09/10/5875650.aspx</a></p>
<img src ="http://www.blogjava.net/Todd/aggbug/331745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Todd/" target="_blank">Todd</a> 2010-09-11 15:50 <a href="http://www.blogjava.net/Todd/archive/2010/09/11/331745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>