﻿<?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-笑看风云-随笔分类-数据库</title><link>http://www.blogjava.net/zh-qi/category/36608.html</link><description>一切从头开始</description><language>zh-cn</language><lastBuildDate>Wed, 07 Jan 2009 18:42:55 GMT</lastBuildDate><pubDate>Wed, 07 Jan 2009 18:42:55 GMT</pubDate><ttl>60</ttl><item><title>sql语句</title><link>http://www.blogjava.net/zh-qi/archive/2009/01/06/250054.html</link><dc:creator>笑看风云</dc:creator><author>笑看风云</author><pubDate>Tue, 06 Jan 2009 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/zh-qi/archive/2009/01/06/250054.html</guid><wfw:comment>http://www.blogjava.net/zh-qi/comments/250054.html</wfw:comment><comments>http://www.blogjava.net/zh-qi/archive/2009/01/06/250054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zh-qi/comments/commentRss/250054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zh-qi/services/trackbacks/250054.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、基础1、说明：创建数据库CREATE&nbsp;DATABASE&nbsp;database-name&nbsp;2、说明：删除数据库drop&nbsp;database&nbsp;dbname3、说明：备份sql&nbsp;server---&nbsp;创建&nbsp;备份数据的&nbsp;deviceUSE&nbsp;masterEXEC&nbsp;sp...&nbsp;&nbsp;<a href='http://www.blogjava.net/zh-qi/archive/2009/01/06/250054.html'>阅读全文</a><img src ="http://www.blogjava.net/zh-qi/aggbug/250054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zh-qi/" target="_blank">笑看风云</a> 2009-01-06 10:25 <a href="http://www.blogjava.net/zh-qi/archive/2009/01/06/250054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate批量插入数据</title><link>http://www.blogjava.net/zh-qi/archive/2008/12/11/245720.html</link><dc:creator>笑看风云</dc:creator><author>笑看风云</author><pubDate>Thu, 11 Dec 2008 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/zh-qi/archive/2008/12/11/245720.html</guid><wfw:comment>http://www.blogjava.net/zh-qi/comments/245720.html</wfw:comment><comments>http://www.blogjava.net/zh-qi/archive/2008/12/11/245720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zh-qi/comments/commentRss/245720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zh-qi/services/trackbacks/245720.html</trackback:ping><description><![CDATA[<br />
<span style="font-size: 10pt">hibernate本身不具备插入批量数据的能力，因此开发中尽量少用。<br />
下面是一个测试例子：<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-size: 10pt"><img id="Codehighlighter1_21_676_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_676_Open_Text.style.display='none'; Codehighlighter1_21_676_Closed_Image.style.display='inline'; Codehighlighter1_21_676_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_676_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_21_676_Closed_Text.style.display='none'; Codehighlighter1_21_676_Open_Image.style.display='inline'; Codehighlighter1_21_676_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;testadd()</span><span id="Codehighlighter1_21_676_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span id="Codehighlighter1_21_676_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session</span><span style="color: #000000">=</span></span><span style="font-size: 10pt"><span style="color: #000000">HibernateUtils.getSession();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
<img id="Codehighlighter1_99_545_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_545_Open_Text.style.display='none'; Codehighlighter1_99_545_Closed_Image.style.display='inline'; Codehighlighter1_99_545_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_545_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_545_Closed_Text.style.display='none'; Codehighlighter1_99_545_Open_Image.style.display='inline'; Codehighlighter1_99_545_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_99_545_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span id="Codehighlighter1_99_545_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx</span><span style="color: #000000">=</span></span><span style="font-size: 10pt"><span style="color: #000000">session.beginTransaction();<br />
<img id="Codehighlighter1_163_517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_517_Open_Text.style.display='none'; Codehighlighter1_163_517_Closed_Image.style.display='inline'; Codehighlighter1_163_517_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_163_517_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_517_Closed_Text.style.display='none'; Codehighlighter1_163_517_Open_Image.style.display='inline'; Codehighlighter1_163_517_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">2000</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_163_517_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span id="Codehighlighter1_163_517_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;Student();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setName(</span><span style="color: #000000">"</span><span style="color: #000000">stu</span><span style="color: #000000">"</span><span style="color: #000000">+</span></span><span style="font-size: 10pt"><span style="color: #000000">i);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setAddr(</span><span style="color: #000000">"</span><span style="color: #000000">addr</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">*</span></span><span style="font-size: 10pt"><span style="color: #000000">i);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(stu);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></span><span style="font-size: 10pt"><span style="color: #008000">添加20条以后，强制入库&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></span><span style="font-size: 10pt"><span style="color: #008000">clear()清空缓存<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></span><span style="font-size: 10pt"><span style="color: #008000">postgres数据库的隔离级别是已提交读(Read&nbsp;committed)，<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></span><span style="font-size: 10pt"><span style="color: #008000">所以flush以后，数据看不到，只有commit后才能看到数据，<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果失败，rollback,前面的flush的数据不会入库</span></span><span style="color: #008000"><br />
<span style="font-size: 10pt"><img id="Codehighlighter1_457_511_Open_Image" onclick="this.style.display='none'; Codehighlighter1_457_511_Open_Text.style.display='none'; Codehighlighter1_457_511_Closed_Image.style.display='inline'; Codehighlighter1_457_511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_457_511_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_457_511_Closed_Text.style.display='none'; Codehighlighter1_457_511_Open_Image.style.display='inline'; Codehighlighter1_457_511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i</span><span style="color: #000000">%</span><span style="color: #000000">20</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)</span><span id="Codehighlighter1_457_511_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span id="Codehighlighter1_457_511_Open_Text"><span style="color: #000000"><span style="font-size: 10pt">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.clear();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_565_615_Open_Image" onclick="this.style.display='none'; Codehighlighter1_565_615_Open_Text.style.display='none'; Codehighlighter1_565_615_Closed_Image.style.display='inline'; Codehighlighter1_565_615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_565_615_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_565_615_Closed_Text.style.display='none'; Codehighlighter1_565_615_Open_Image.style.display='inline'; Codehighlighter1_565_615_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="font-size: 10pt"><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;ex)</span><span id="Codehighlighter1_565_615_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span style="font-size: 10pt"><span id="Codehighlighter1_565_615_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.rollback();<br />
<img id="Codehighlighter1_623_669_Open_Image" onclick="this.style.display='none'; Codehighlighter1_623_669_Open_Text.style.display='none'; Codehighlighter1_623_669_Closed_Image.style.display='inline'; Codehighlighter1_623_669_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_623_669_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_623_669_Closed_Text.style.display='none'; Codehighlighter1_623_669_Open_Image.style.display='inline'; Codehighlighter1_623_669_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">finally</span><span id="Codehighlighter1_623_669_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span></span><span id="Codehighlighter1_623_669_Open_Text"><span style="color: #000000"><span style="font-size: 10pt">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtils.closeSession(session);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 10pt"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
<br />
<span style="font-size: 10pt">我使用的数据库是postgres,通过flush把数据强制入库，然后通过session.clear()清空缓存中的实体对象，防止jvm内存溢出，速度还行。<br />
不过没有大批量的添加，如果大批量的添加可能要考虑使用JDBC,还不行的话，估计得使用的数据库本身自带的快速导入工具.还不行的话，没话说，换数据库，哈哈。</span>
<img src ="http://www.blogjava.net/zh-qi/aggbug/245720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zh-qi/" target="_blank">笑看风云</a> 2008-12-11 16:10 <a href="http://www.blogjava.net/zh-qi/archive/2008/12/11/245720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>postgres隔离级别</title><link>http://www.blogjava.net/zh-qi/archive/2008/12/11/245655.html</link><dc:creator>笑看风云</dc:creator><author>笑看风云</author><pubDate>Thu, 11 Dec 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/zh-qi/archive/2008/12/11/245655.html</guid><wfw:comment>http://www.blogjava.net/zh-qi/comments/245655.html</wfw:comment><comments>http://www.blogjava.net/zh-qi/archive/2008/12/11/245655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zh-qi/comments/commentRss/245655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zh-qi/services/trackbacks/245655.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">多版本并行控制（Multi</span><span style="color: #000000">-</span><span style="color: #000000">Version&nbsp;Concurrency&nbsp;Control&nbsp;（MVCC））是用于提高数据库在一个多用户环境下性能的高级技术。Vadim&nbsp;Mikheev&nbsp;为&nbsp;Postgres&nbsp;提供了MVCC的实现。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />介绍<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与其他使用锁来进行并行控制的数据库系统不同，Postgres&nbsp;利用多版本模型来维护数据的一致性。这就意味着当检索数据库时，每个事务都看到一个数据的一段时间前的快照（一个&nbsp;数据库版本），而不管正在处理的数据当前的状态。这样，如果对每个数据库会话进行&nbsp;事务隔离，就可以避免一个事务看到因为其它并行的事务更新同一行数据而导致的不连贯的数据。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />多版本和锁定模型的主要区别是在&nbsp;MVCC&nbsp;里，对检索（读）数据的锁要求与写数据的锁要求不冲突，所以读不会阻塞写，而写也从不阻塞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />▲事务隔离<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ANSI</span><span style="color: #000000">/</span><span style="color: #000000">ISOSQL&nbsp;用三个必须在并行的事务之间避免的现象定义了四个级别的事务隔离。这些不希望发生的现象是：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />读污染（dirty&nbsp;reads）&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />一个事务读取了被另一个未提交的并行的事务写的数据。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />不可重复的读（non</span><span style="color: #000000">-</span><span style="color: #000000">repeatable&nbsp;reads）&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />一个事务重新读取前面读取过的数据，发现该数据已经被另一个已提交的事务修改过。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />错误读取（phantom&nbsp;read）&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />一个事务重新执行一个查询，返回一套符合查询条件的行，发现这些行中插入了被其他已提交的事务提交的行。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />这四种隔离级别和对应的特性在下面描述。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />表&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;Postgres&nbsp;隔离级别&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />▲读已提交隔离级别<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />读已提交（Read&nbsp;Committed）是Postgres&nbsp;里的缺省隔离级别。当一个事务运行在这个隔离级别时，一个查询只能看到查询开始之前的数据而永远无法看到脏数据或者是在查询执行时其他并行的事务提交做的改变。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />如果一个正在执行一个&nbsp;UPDATE&nbsp;语句（或者&nbsp;DELETE&nbsp;或者&nbsp;SELECT&nbsp;FOR&nbsp;UPDATE）的查询返回的行正在被另一个并行的未提交的事务更新，那么第二个试图更新此行的事务将等待另一个事务的提交或者回卷。如果发生了回卷，等待中的事务可以继续修改此行。如果发生了提交（并且此行仍然存在；也就是说，没有被另一个事务删除），这个查询将对该行再执行一便以检查新行版本是否满足查询搜索条件。如果新行版本满足查询搜索条件，那么该行将被更新（或删除或被标记为更新）。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />注意&nbsp;SELECT&nbsp;或&nbsp;INSERT&nbsp;语句执行的结果（在一个查询里）将不会被并行事务影响。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />可串行化隔离级别<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />可串行化（Serializable）提供最高级别的事务隔离。当一个事务处于可串行化级别，一个查询只能看到在事务开始之前提交的数据而永远看不到脏数据或事务执行中其他并行事务提交的修改。所以，这个级别模拟串行事务执行，就好象事务将被一个接着一个那样串行的，而不是并行的执行。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />如果一个正在执行一个&nbsp;UPDATE&nbsp;语句（或者&nbsp;DELETE&nbsp;或者&nbsp;SELECT&nbsp;FOR&nbsp;UPDATE）的查询返回的行正在被另一个并行的未提交的事务更新，那么第二个试图更新此行的事务将等待另一个事务的提交或者回卷。如果发生了回卷，等待中的事务可以继续修改此行。如果发生一个并行的事务的提交，一个可串行化的事务将回卷，并返回下面信息。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ERROR:&nbsp;Can&#180;t&nbsp;serialize&nbsp;access&nbsp;due&nbsp;to&nbsp;concurrent&nbsp;update<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />因为一个可串行化的事务在可串行化事务开始之后不能更改被其他事务更改过的行。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />注意:&nbsp;SELECT&nbsp;或&nbsp;INSERT&nbsp;语句执行的结果（在一个查询里）将不会被并行事务影响。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />▲锁和表<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Postgres&nbsp;提供多种锁模式来控制对表中数据的并行访问。有些锁模式是在语句执行之前由Postgres&nbsp;自动施加的，而其他的提供用来由应用使用的。一个事务里要求的所有锁模式（除了&nbsp;AccessShareLock）都是在整个事务期间保有的。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />除了锁以外，短期的共享</span><span style="color: #000000">/</span><span style="color: #000000">排他销也在共享的缓冲池中用于控制对表页面的读</span><span style="color: #000000">/</span><span style="color: #000000">写访问。销在一条记录抓取或者更新后马上被释放。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />表级锁<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AccessShareLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />一个内部锁模式，进行查询时自动施加在被查询的表上。语句执行完成后，Postgres&nbsp;释放这些锁。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />只与&nbsp;AccessExclusiveLock&nbsp;冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />RowShareLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被&nbsp;SELECT&nbsp;FOR&nbsp;UPDATE&nbsp;和用于&nbsp;IN&nbsp;ROW&nbsp;SHARE&nbsp;MODE&nbsp;的&nbsp;LOCK&nbsp;TABLE&nbsp;语句要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />RowExclusiveLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被&nbsp;UPDATE,&nbsp;DELETE,&nbsp;INSERT&nbsp;和用于IN&nbsp;ROW&nbsp;EXCLUSIVE&nbsp;MODE&nbsp;的&nbsp;LOCK&nbsp;TABLE&nbsp;语句要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;ShareLock，ShareRowExclusiveLock，ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ShareLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被&nbsp;CREATE&nbsp;INDEX&nbsp;和用于IN&nbsp;SHARE&nbsp;MODE&nbsp;的&nbsp;LOCK&nbsp;TABLE&nbsp;语句所要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;RowExclusiveLock，ShareRowExclusiveLock，ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ShareRowExclusiveLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被用于&nbsp;IN&nbsp;SHARE&nbsp;ROW&nbsp;EXCLUSIVE&nbsp;MODE&nbsp;的&nbsp;LOCK&nbsp;TABLE&nbsp;语句要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;RowExclusiveLock，ShareLock，ShareRowExclusiveLock，ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ExclusiveLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被用于&nbsp;IN&nbsp;EXCLUSIVE&nbsp;MODE&nbsp;的&nbsp;LOCK&nbsp;TABLE&nbsp;语句要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;RowShareLock，RowExclusiveLock，ShareLock，ShareRowExclusiveLock，ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AccessExclusiveLock&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />被&nbsp;ALTER&nbsp;TABLE，DROP&nbsp;TABLE，VACUUM&nbsp;和&nbsp;LOCK&nbsp;TABLE&nbsp;语句要求。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />与&nbsp;RowShareLock，RowExclusiveLock，ShareLock，ShareRowExclusiveLock，ExclusiveLock&nbsp;和&nbsp;AccessExclusiveLock&nbsp;模式冲突。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />注意：<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />只有&nbsp;AccessExclusiveLock&nbsp;阻塞&nbsp;SELECT&nbsp;（没有&nbsp;FOR&nbsp;UPDATE）语句。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />行级锁<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />当某行的一个内部字段被更新（或删除或标记为更新）时要求使用这些锁。Postgres&nbsp;在内存里不做关于已更新的行的任何记忆，因而对锁定的行数没有任何限制，也没有锁定递增。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />但是，要注意&nbsp;SELECT&nbsp;FOR&nbsp;UPDATE&nbsp;会更改所选定的行以标记它们，因而会导致磁盘写动作。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />行级别的锁不影响数据查询。它们只是用于阻塞对同一行的写。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />锁和索引<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />尽管&nbsp;Postgres&nbsp;提供对表数据访问的非阻塞的读</span><span style="color: #000000">/</span><span style="color: #000000">写，但并非所有Postgres&nbsp;里实现的索引访问模式都能够进行非阻塞读</span><span style="color: #000000">/</span><span style="color: #000000">写。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />各种各样的索引类型按照下面方法操作：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />GiST&nbsp;和&nbsp;R</span><span style="color: #000000">-</span><span style="color: #000000">Tree&nbsp;索引&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />共享</span><span style="color: #000000">/</span><span style="color: #000000">排他的索引级锁用于读</span><span style="color: #000000">/</span><span style="color: #000000">写访问。锁在语句完成后释放。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Hash&nbsp;（散列）索引&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />共享</span><span style="color: #000000">/</span><span style="color: #000000">排他的页面级锁用于读</span><span style="color: #000000">/</span><span style="color: #000000">写访问。锁在页面处理完成后释放。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />页面级锁比索引级的锁提供了更好的并行性但是容易产生死锁。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Btree&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />短期的共享</span><span style="color: #000000">/</span><span style="color: #000000">排他的页面级的销用于读</span><span style="color: #000000">/</span><span style="color: #000000">写访问。销在索引记录被插入</span><span style="color: #000000">/</span><span style="color: #000000">抓取后立即释放。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Btree&nbsp;索引提供了无死锁条件的最高级的并行性。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />应用层的数据完整性检查<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />因为对&nbsp;Postgres&nbsp;的读动作不会锁定数据，不管事务是何隔离级别，一个事务读取的数据可能被另一个事务覆盖。换句话说，如果一条&nbsp;SELECT&nbsp;返回了一行，这并不意味着在返回该行时该行还存在（比如说在语句完成或事务开始后的某时）也不意味着在当前事务做提交或者回卷前该行被保护不被并行的事务删除或更新。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />要保证一行的实际存在和避免其被并行更新，我们必须使用&nbsp;SELECT&nbsp;FOR&nbsp;UPDATE&nbsp;或者合适的&nbsp;LOCK&nbsp;TABLE&nbsp;语句。当从其他环境向&nbsp;Postgres&nbsp;里用可串行化模式移植应用时一定要把这些问题考虑进去。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />注意：&nbsp;在版本&nbsp;</span><span style="color: #000000">6.5</span><span style="color: #000000">&nbsp;前，Postgres&nbsp;使用读动作锁，因而当从以前的&nbsp;Postgres&nbsp;版本向6.</span><span style="color: #000000">5</span><span style="color: #000000">（或更高版本）升级时也要考虑这些问题。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
Postgres 隔离级别<br />
<img height="127" alt="" src="http://www.blogjava.net/images/blogjava_net/zh-qi/ss.jpg" width="728" border="0" /><br />
 <img src ="http://www.blogjava.net/zh-qi/aggbug/245655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zh-qi/" target="_blank">笑看风云</a> 2008-12-11 11:48 <a href="http://www.blogjava.net/zh-qi/archive/2008/12/11/245655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>