﻿<?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/mlxlzc/category/31531.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 16 May 2008 10:37:59 GMT</lastBuildDate><pubDate>Fri, 16 May 2008 10:37:59 GMT</pubDate><ttl>60</ttl><item><title>关于分页处理</title><link>http://www.blogjava.net/mlxlzc/articles/200888.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200888.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200888.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200888.html</trackback:ping><description><![CDATA[在做view的时候往往要把批量数据显示给用户看，那么这个时候我们就要对数据做分页操作<br />
总的来讲分页有两种方式：<br />
<br />
<span style="color: red;">1：数据库服务器端处理</span><br />
&nbsp;&nbsp; 就是说在数据库上做查询时就只返回需要的数据如：<br />
&nbsp;&nbsp; sqlserver : select TOP num * from table 然后再对结果集进行处理<br />
&nbsp;&nbsp; oracle：select * from ( select rownum row_num,TABLE_L.* from ( select * from table where A order <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by B) TABLE_L ) where row_num &lt;=num 需要做3层嵌套是因为rownum虚字段的性质造成的<br />
<span style="color: red;"><br />
2：在应用软件端处理</span><br />
&nbsp;&nbsp; 先使用select * from table A where B order by C<br />
&nbsp;&nbsp; 然后对获得的结果处理<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intRowCount&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;rs.getRow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(rs.getRow()&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;startIndex&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;rs.getRow()&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;endIndex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">形成显示html</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />
&nbsp;}</span></div>
&nbsp;&nbsp; <br />
两种方法各有优势，如果在数据量不是很大的情况下，建议使用第二种，有利于sql的统一<br />
在数据量大以及数据库服务器隔离远和网络传输满的情况下建议使用第一种减少传输量<br />
<br />
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 13:56 <a href="http://www.blogjava.net/mlxlzc/articles/200888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>索引的机制（引用）</title><link>http://www.blogjava.net/mlxlzc/articles/200810.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200810.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200810.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200810.html</trackback:ping><description><![CDATA[<p><strong>一、深入浅出理解索引结构</strong><br />
<br />
实际上，您可以把索引理解为一种特殊的目录。微软的SQL
SERVER提供了两种索引：聚集索引（clustered index，也称聚类索引、簇集索引）和非聚集索引（nonclustered
index，也称非聚类索引、非簇集索引）。下面，我们举例来说明一下聚集索引和非聚集索引的区别：<br />
其实，我们的汉语字典的正文本身就是一个
聚集索引。比如，我们要查&#8220;安&#8221;字，就会很自然地翻开字典的前几页，因为&#8220;安&#8221;的拼音是&#8220;an&#8221;，而按照拼音排序汉字的字典是以英文字母&#8220;a&#8221;开头并以
&#8220;z&#8221;结尾的，那么&#8220;安&#8221;字就自然地排在字典的前部。如果您翻完了所有以&#8220;a&#8221;开头的部分仍然找不到这个字，那么就说明您的字典中没有这个字；同样的，如
果查&#8220;张&#8221;字，那您也会将您的字典翻到最后部分，因为&#8220;张&#8221;的拼音是&#8220;zhang&#8221;。也就是说，字典的正文部分本身就是一个目录，您不需要再去查其他目录
来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为&#8220;聚集索引&#8221;。<br />
如果您认识某个字，您可以快速地从自动中查
到这个字。但您也可能会遇到您不认识的字，不知道它的发音，这时候，您就不能按照刚才的方法找到您要查的字，而需要去根据&#8220;偏旁部首&#8221;查到您要找的字，然
后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合&#8220;部首目录&#8221;和&#8220;检字表&#8221;而查到的字的排序并不是真正的正文的排序方法，比如您查&#8220;张&#8221;字，
我们可以看到在查部首之后的检字表中&#8220;张&#8221;的页码是672页，检字表中&#8220;张&#8221;的上面是&#8220;驰&#8221;字，但页码却是63页，&#8220;张&#8221;的下面是&#8220;弩&#8221;字，页面是390
页。很显然，这些字并不是真正的分别位于&#8220;张&#8221;字的上下方，现在您看到的连续的&#8220;驰、张、弩&#8221;三字实际上就是他们在非聚集索引中的排序，是字典正文中的字
在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字，但它需要两个过程，先找到目录中的结果，然后再翻到您所需要的页码。我们把这种目录纯粹
是目录，正文纯粹是正文的排序方式称为&#8220;非聚集索引&#8221;。<br />
通过以上例子，我们可以理解到什么是&#8220;聚集索引&#8221;和&#8220;非聚集索引&#8221;。进一步引申一下，我们可以很容易的理解：每个表只能有一个聚集索引，因为目录只能按照一种方法进行排序。<br />
<br />
<strong>二、何时使用聚集索引或非聚集索引</strong><br />
<br />
下面的表总结了何时使用聚集索引或非聚集索引（很重要）：</p>
<table style="color: #000000; border-collapse: collapse;" id="AutoNumber1" border="1" cellpadding="0" cellspacing="0" height="107" width="62%">
    <tbody>
        <tr>
            <td align="center" height="23" width="40%">动作描述</td>
            <td align="center" height="23" width="29%">使用聚集索引</td>
            <td align="center" height="23" width="31%">使用非聚集索引</td>
        </tr>
        <tr>
            <td height="20" width="40%">列经常被分组排序</td>
            <td height="20" width="29%">应</td>
            <td height="20" width="31%">应</td>
        </tr>
        <tr>
            <td height="20" width="40%">返回某范围内的数据</td>
            <td height="20" width="29%">应</td>
            <td height="20" width="31%">不应</td>
        </tr>
        <tr>
            <td height="20" width="40%">一个或极少不同值</td>
            <td height="20" width="29%">不应</td>
            <td height="20" width="31%">不应</td>
        </tr>
        <tr>
            <td height="20" width="40%">小数目的不同值</td>
            <td height="20" width="29%">应</td>
            <td height="20" width="31%">不应</td>
        </tr>
        <tr>
            <td height="20" width="40%">大数目的不同值</td>
            <td height="20" width="29%">不应</td>
            <td height="20" width="31%">应</td>
        </tr>
        <tr>
            <td height="20" width="40%">频繁更新的列</td>
            <td height="20" width="29%">不应</td>
            <td height="20" width="31%">应</td>
        </tr>
        <tr>
            <td height="20" width="40%">外键列</td>
            <td height="20" width="29%">应</td>
            <td height="20" width="31%">应</td>
        </tr>
        <tr>
            <td height="20" width="40%">主键列</td>
            <td height="20" width="29%">应</td>
            <td height="20" width="31%">应</td>
        </tr>
        <tr>
            <td height="20" width="40%">频繁修改索引列</td>
            <td height="20" width="29%">不应</td>
            <td height="20" width="31%">应</td>
        </tr>
    </tbody>
</table>
<p>
事实上，我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如：返回某范围内的数据一项。比如您的某个表有一个时间列，恰好您把聚合索引建
立在了该列，这时您查询2004年1月1日至2004年10月1日之间的全部数据时，这个速度就将是很快的，因为您的这本字典正文是按日期进行排序的，聚
类索引只需要找到要检索的所有数据中的开头和结尾数据即可；而不像非聚集索引，必须先查到目录中查到每一项数据对应的页码，然后再根据页码查到具体内容。<br />
<br />
<strong>三、结合实际，谈索引使用的误区</strong><br />
<br />
理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引，但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区，以便于大家掌握索引建立的方法。<br />
<br />
1、主键就是聚集索引<br />
这种想法笔者认为是极端错误的，是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。<br />
通常，我们会在每个表中都建立一个ID列，以区分每条数据，并且这个ID列是自动增大的，步长一般为1。我们的这个办公自动化的实例中的列Gid就是如
此。此时，如果我们将这个列设为主键，SQL
SERVER会将此列默认为聚集索引。这样做有好处，就是可以让您的数据在数据库中按照ID进行物理排序，但笔者认为这样做意义不大。<br />
显而易见，聚集索引的优势是很明显的，而每个表中只能有一个聚集索引的规则，这使得聚集索引变得更加珍贵。<br />
从我们前面谈到的聚集索引的定义我们可以看出，使用聚集索引的最大好处就是能够根据查询要求，迅速缩小查询范围，避免全表扫描。在实际应用中，因为ID
号是自动生成的，我们并不知道每条记录的ID号，所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次，
让每个ID号都不同的字段作为聚集索引也不符合&#8220;大数目的不同值情况下不应建立聚合索引&#8221;规则；当然，这种情况只是针对用户经常修改记录内容，特别是索引
项的时候会负作用，但对于查询速度并没有影响。<br />
在办公自动化系统中，无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。<br />
通常，办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况，但如果您的系统已建立了很
长时间，并且数据量很大，那么，每次每个用户打开首页的时候都进行一次全表扫描，这样做意义是不大的，绝大多数的用户1个月前的文件都已经浏览过了，这样
做只能徒增数据库的开销而已。事实上，我们完全可以让用户打开系统首页时，数据库仅仅查询这个用户近3个月来未阅览的文件，通过&#8220;日期&#8221;这个字段来限制表
扫描，提高查询速度。如果您的办公自动化系统已经建立的2年，那么您的首页显示速度理论上将是原来速度8倍，甚至更快。<br />
在这里之所以提到&#8220;理
论上&#8221;三字，是因为如果您的聚集索引还是盲目地建在ID这个主键上时，您的查询速度是没有这么高的，即使您在&#8220;日期&#8221;这个字段上建立的索引（非聚合索
引）。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现（3个月内的数据为25万条）：<br />
<br />
（1）仅在主键上建立聚集索引，并且不划分时间段：</p>
<pre>Select gid,fariqi,neibuyonghu,title from tgongwen</pre>
<p>用时：128470毫秒（即：128秒）<br />
<br />
（2）在主键上建立聚集索引，在fariq上建立非聚集索引：</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen<br />
where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：53763毫秒（54秒）<br />
<br />
（3）将聚合索引建立在日期列（fariqi）上：</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen<br />
where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：2423毫秒（2秒）<br />
<br />
虽然每条语句提取出来的都是25万条数据，各种情况的差异却是巨大的，特别是将聚集索引建立在日期列时的差异。事实上，如果您的数据库真的有1000万
容量的话，把主键建立在ID列上，就像以上的第1、2种情况，在网页上的表现就是超时，根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因
素。得出以上速度的方法是：在各个select语句前加：</p>
<pre>declare @d datetime<br />
set @d=getdate()</pre>
<p>并在select语句后加：</p>
<pre>select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())</pre>
<p>2、只要建立索引就能显著提高查询速度<br />
事实上，我们可以发现上面的例子中，第2、3条语句完全相同，且建立索引的字段也相同；不同的仅是前者在fariqi字段上建立的是非聚合索引，后者在此字段上建立的是聚合索引，但查询速度却有着天壤之别。所以，并非是在任何字段上简单地建立索引就能提高查询速度。<br />
从建表的语句中，我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中，
我们每天都会发几个文件，这几个文件的发文日期就相同，这完全符合建立聚集索引要求的：&#8220;既不能绝大多数都相同，又不能只有极少数相同&#8221;的规则。由此看
来，我们建立&#8220;适当&#8221;的聚合索引对于我们提高查询速度是非常重要的。<br />
<br />
3、把所有需要提高查询速度的字段都加进聚集索引，以提高查询速度<br />
上面已经谈到：在进行数据查询时都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。既然这两个字段都是如此的重要，我们可以把他们合并起来，建立一个复合索引（compound index）。<br />
很多人认为只要把任何字段加进聚集索引，就能提高查询速度，也有人感到迷惑：如果把复合的聚集索引字段分开查询，那么查询速度会减慢吗？带着这个问题，
我们来看一下以下的查询速度（结果集都是25万条数据）：（日期列fariqi首先排在复合聚集索引的起始列，用户名neibuyonghu排在后列）：</p>
<pre>（1）select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi&gt;''2004-5-5'' </pre>
<p>查询速度：2513毫秒</p>
<pre>（2）select gid,fariqi,neibuyonghu,title from Tgongwen <br />
where fariqi&gt;''2004-5-5'' and neibuyonghu=''办公室''</pre>
<p>查询速度：2516毫秒</p>
<pre>（3）select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''</pre>
<p>查询速度：60280毫秒<br />
<br />
从以上试验中，我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的，甚至比用上全部的复合索引列
还要略快（在查询结果集数目一样的情况下）；而如果仅用复合聚集索引的非起始列作为查询条件的话，这个索引是不起任何作用的。当然，语句1、2的查询速度
一样是因为查询的条目数一样，如果复合索引的所有列都用上，而且查询结果少的话，这样就会形成&#8220;索引覆盖&#8221;，因而性能可以达到最优。同时，请记住：无论您
是否经常使用聚合索引的其他列，但其前导列一定要是使用最频繁的列。<br />
<br />
<strong>四、其他书上没有的索引使用经验总结</strong><br />
<br />
1、<font color="#ff0000"><strong>用聚合索引比用不是聚合索引的主键速度快</strong></font><br />
下面是实例语句：（都是提取25万条数据）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>使用时间：3326毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid&lt;=250000</pre>
<p>使用时间：4470毫秒<br />
<br />
这里，用聚合索引比用不是聚合索引的主键速度快了近1/4。<br />
<br />
2、用聚合索引比用一般的主键作order by时速度快，特别是在小数据量情况下</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi</pre>
<p>用时：12936</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid</pre>
<p>用时：18843<br />
<br />
这里，用聚合索引比用一般的主键作order by时，速度快了3/10。事实上，如果数据量很小的话，用聚集索引作为排序列要比使用非聚集索引速度快得明显的多；而数据量如果很大的话，如10万以上，则二者的速度差别不明显。<br />
<br />
3、使用聚合索引内的时间段，搜索时间会按数据占整个数据表的百分比成比例减少，而无论聚合索引使用了多少个：</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-1-1''</pre>
<p>用时：6343毫秒（提取100万条） </p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-6-6''</pre>
<p>用时：3170毫秒（提取50万条）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>用时：3326毫秒（和上句的结果一模一样。如果采集的数量一样，那么用大于号和等于号是一样的）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br />
where fariqi&gt;''2004-1-1'' and fariqi&lt;''2004-6-6''</pre>
<p>用时：3280毫秒<br />
<br />
4、日期列不会因为有分秒的输入而减慢查询速度<br />
下面的例子中，共有100万条数据，2004年1月1日以后的数据有50万条，但只有两个不同的日期，日期精确到日；之前有数据50万条，有5000个不同的日期，日期精确到秒。</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br />
where fariqi&gt;''2004-1-1'' order by fariqi</pre>
<p>用时：6390毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br />
where fariqi&lt;''2004-1-1'' order by fariqi</pre>
用时：6453毫秒<br />
<br />
<strong>五、其他注意事项</strong><br />
<br />
&#8220;水可载舟，亦可覆舟&#8221;，索引也一样。索引有助于提高检索性能，但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引，数据库就要做更多的工作。过多的索引甚至会导致索引碎片。<br />
所以说，我们要建立一个&#8220;适当&#8221;的索引体系，特别是对聚合索引的创建，更应精益求精，以使您的数据库能得到高性能的发挥。<br />
当然，在实践中，作为一个尽职的数据库管理员，您还要多测试一些方案，找出哪种方案效率最高、最为有效。
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 10:42 <a href="http://www.blogjava.net/mlxlzc/articles/200810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLServer和Oracle常用函数对比</title><link>http://www.blogjava.net/mlxlzc/articles/200809.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200809.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200809.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200809.html</trackback:ping><description><![CDATA[<p>数学函数</p>
<p>　　1.绝对值 <br />
S:select abs(-1) value <br />
O:select abs(-1) value from dual </p>
<p>　　2.取整(大) <br />
S:select ceiling(-1.001) value <br />
O:select ceil(-1.001) value from dual </p>
<p>　　3.取整（小） <br />
S:select floor(-1.001) value <br />
O:select floor(-1.001) value from dual </p>
<p>　　4.取整（截取） <br />
S:select cast(-1.002 as int) value <br />
O:select trunc(-1.002) value from dual </p>
<p>　　5.四舍五入 <br />
S:select round(1.23456,4) value 1.23460 <br />
O:select round(1.23456,4) value from dual 1.2346 </p>
<p>　　6.e为底的幂 <br />
S:select Exp(1) value 2.7182818284590451 <br />
O:select Exp(1) value from dual 2.71828182 </p>
<p>　　7.取e为底的对数 <br />
S:select log(2.7182818284590451) value 1 <br />
O:select ln(2.7182818284590451) value from dual; 1 </p>
<p>　　8.取10为底对数 <br />
S:select log10(10) value 1 <br />
O:select log(10,10) value from dual; 1 </p>
<p>　　9.取平方 <br />
S:select SQUARE(4) value 16 <br />
O:select power(4,2) value from dual 16 </p>
<p>　　10.取平方根 <br />
S:select SQRT(4) value 2 <br />
O:select SQRT(4) value from dual 2 </p>
<p>　　11.求任意数为底的幂 <br />
S:select power(3,4) value 81 <br />
O:select power(3,4) value from dual 81 </p>
<p>　　12.取随机数 <br />
S:select rand() value <br />
O:select sys.dbms_random.value(0,1) value from dual; </p>
<p>　　13.取符号 <br />
S:select sign(-8) value -1 <br />
O:select sign(-8) value from dual -1 </p>
<p>　　14.圆周率 <br />
S:SELECT PI() value 3.1415926535897931 <br />
O:不知道 </p>
<p>　　15.sin,cos,tan 参数都以弧度为单位 <br />
例如：select sin(PI()/2) value 得到1（SQLServer） </p>
<p>　　16.Asin,Acos,Atan,Atan2 返回弧度 </p>
<p>　　17.弧度角度互换(SQLServer，Oracle不知道) <br />
DEGREES：弧度-〉角度 <br />
RADIANS：角度-〉弧度 </p>
<p>数值间比较 </p>
<p>　　18. 求集合最大值 <br />
S:select max(value) value from <br />
(select 1 value <br />
union <br />
select -2 value <br />
union <br />
select 4 value <br />
union <br />
select 3 value)a </p>
<p>　　O:select greatest(1,-2,4,3) value from dual </p>
<p>　　19. 求集合最小值 <br />
S:select min(value) value from <br />
(select 1 value <br />
union <br />
select -2 value <br />
union <br />
select 4 value <br />
union <br />
select 3 value)a </p>
<p>　　O:select least(1,-2,4,3) value from dual </p>
<p>　　20.如何处理null值(F2中的null以10代替) <br />
S:select F1,IsNull(F2,10) value from Tbl <br />
O:select F1,nvl(F2,10) value from Tbl </p>
<p>　　21.求字符序号 <br />
S:select ascii('a') value <br />
O:select ascii('a') value from dual </p>
<p>　　22.从序号求字符 <br />
S:select char(97) value <br />
O:select chr(97) value from dual </p>
<p>　　23.连接 <br />
S:select '11'+'22'+'33' value <br />
O:select CONCAT('11','22')　　33 value from dual </p>
<p>23.子串位置 --返回3 <br />
S:select CHARINDEX('s','sdsq',2) value <br />
O:select INSTR('sdsq','s',2) value from dual </p>
<p>　　23.模糊子串的位置 --返回2,参数去掉中间%则返回7 <br />
S:select patindex('%d%q%','sdsfasdqe') value <br />
O:oracle没发现，但是instr可以通过第四个参数控制出现次数 <br />
select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6 </p>
<p>　　24.求子串 <br />
S:select substring('abcd',2,2) value <br />
O:select substr('abcd',2,2) value from dual </p>
<p>　　25.子串代替 返回aijklmnef <br />
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value <br />
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual </p>
<p>　　26.子串全部替换 <br />
S:没发现 <br />
O:select Translate('fasdbfasegas','fa','我' ) value from dual </p>
<p>　　27.长度 <br />
S:len,datalength <br />
O:length <br />
&nbsp;&nbsp;&nbsp; <a href="http://www.knowsky.com/"><u><font color="#0000ff">www.knowsky.com</font></u></a><br />
28.大小写转换 lower,upper </p>
<p>　　29.单词首字母大写 <br />
S:没发现 <br />
O:select INITCAP('abcd dsaf df') value from dual </p>
<p>　　30.左补空格（LPAD的第一个参数为空格则同space函数） <br />
S:select space(10)+'abcd' value <br />
O:select LPAD('abcd',14) value from dual </p>
<p>　　31.右补空格（RPAD的第一个参数为空格则同space函数） <br />
S:select 'abcd'+space(10) value <br />
O:select RPAD('abcd',14) value from dual </p>
<p>　　32.删除空格 <br />
S:ltrim,rtrim <br />
O:ltrim,rtrim,trim </p>
<p>　　33. 重复字符串 <br />
S:select REPLICATE('abcd',2) value <br />
O:没发现 </p>
<p>　　34.发音相似性比较(这两个单词返回值一样，发音相同) <br />
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') <br />
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual <br />
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差 <br />
返回0-4，4为同音，1最高 </p>
<p>日期函数 <br />
35.系统时间 <br />
S:select getdate() value <br />
O:select sysdate value from dual </p>
<p>　　36.前后几日 <br />
直接与整数相加减 </p>
<p>　　37.求日期 <br />
S:select convert(char(10),getdate(),20) value <br />
O:select trunc(sysdate) value from dual <br />
select to_char(sysdate,'yyyy-mm-dd') value from dual </p>
<p>　　38.求时间 <br />
S:select convert(char(8),getdate(),108) value <br />
O:select to_char(sysdate,'hh24:mm:ss') value from dual </p>
<p>39.取日期时间的其他部分 <br />
S:DATEPART 和 DATENAME 函数 （第一个参数决定） <br />
O:to_char函数 第二个参数决定 </p>
<p>　　参数---------------------------------下表需要补充 <br />
year yy, yyyy <br />
quarter qq, q (季度) <br />
month mm, m (m O无效) <br />
dayofyear dy, y (O表星期) <br />
day dd, d (d O无效) <br />
week wk, ww (wk O无效) <br />
weekday dw (O不清楚) <br />
Hour hh,hh12,hh24 (hh12,hh24 S无效) <br />
minute mi, n (n O无效) <br />
second ss, s (s O无效) <br />
millisecond ms (O无效) <br />
---------------------------------------------- </p>
<p>　　40.当月最后一天 <br />
S:不知道 <br />
O:select LAST_DAY(sysdate) value from dual </p>
<p>　　41.本星期的某一天（比如星期日） <br />
S:不知道 <br />
O:SELECT Next_day(sysdate,7) vaule FROM DUAL; </p>
<p>　　42.字符串转时间 <br />
S:可以直接转或者select cast('2004-09-08'as datetime) value <br />
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL; </p>
<p>　　43.求两日期某一部分的差（比如秒） <br />
S:select datediff(ss,getdate(),getdate()+12.3) value <br />
O:直接用两个日期相减（比如d1-d2=12.3） <br />
SELECT (d1-d2)*24*60*60 vaule FROM DUAL; </p>
<p>　　44.根据差值求新的日期（比如分钟） <br />
S:select dateadd(mi,8,getdate()) value <br />
O:SELECT sysdate+8/60/24 vaule FROM DUAL; </p>
<p>　　45.求不同时区时间 <br />
S:不知道 <br />
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL; </p>
<p>　　-----时区参数,北京在东8区应该是Ydt------- <br />
AST ADT 大西洋标准时间 <br />
BST BDT 白令海标准时间 <br />
CST CDT 中部标准时间 <br />
EST EDT 东部标准时间 <br />
GMT 格林尼治标准时间 <br />
HST HDT 阿拉斯加?夏威夷标准时间 <br />
MST MDT 山区标准时间 <br />
NST 纽芬兰标准时间 <br />
PST PDT 太平洋标准时间 <br />
YST YDT YUKON标准时间 </p>
<br />
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 10:40 <a href="http://www.blogjava.net/mlxlzc/articles/200809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE加锁</title><link>http://www.blogjava.net/mlxlzc/articles/200808.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200808.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200808.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200808.html</trackback:ping><description><![CDATA[<p>行级锁<br />
可以用select * from table where aa=bb for update;<br />
<br />
表级锁<br />
lock table table_name</p>
<p>需要注意的是select * ..for update 会对所有返回的行加锁。单其他记录是可以只查询这些行的。<br />
所以 要想起到真真加锁机制，做操作时select都要 加上for update</p>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 10:38 <a href="http://www.blogjava.net/mlxlzc/articles/200808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver 死锁分析</title><link>http://www.blogjava.net/mlxlzc/articles/200806.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200806.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200806.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200806.html</trackback:ping><description><![CDATA[<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">虽然不能完全避免死锁，但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销，因为只有很少的事务：</span></p>
<ul style="margin-top: 0cm;">
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">回滚，而回滚会取消事务执行的所有工作。</span> </li>
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">由于死锁时回滚而由应用程序重新提交。</span></li>
</ul>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">下列方法有助于最大限度地降低死锁：</span></p>
<ul style="margin-top: 0cm;">
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">按同一顺序访问对象。</span> </li>
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">避免事务中的用户交互。</span> </li>
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">保持事务简短并在一个批处理中。</span> </li>
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">使用低隔离级别。</span> </li>
    <li style="line-height: 200%; text-align: left;"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">使用绑定连接。</span></li>
</ul>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">按同一顺序访问对象</span></strong></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">如果所有并发事务按同一顺序访问对象，则发生死锁的可能性会降低。例如，如果两个并发事务获得 <strong>Supplier</strong>表上的锁，然后获得 <strong>Part</strong>表上的锁，则在其中一个事务完成之前，另一个事务被阻塞在 <strong>Supplier</strong>表上。第一个事务提交或回滚后，第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。</span></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">避免事务中的用户交互</span></strong></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">避
免编写包含用户交互的事务，因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度，例如答复应用程序请求参数的提示。例如，如果事务正在
等待用户输入，而用户去吃午餐了或者甚至回家过周末了，则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量，因为事务持有的任何锁只有在事务提交或
回滚时才会释放。即使不出现死锁的情况，访问同一资源的其它事务也会被阻塞，等待该事务完成。</span></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">保持事务简短并在一个批处理中</span></strong></p>
<br />
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长，其持有排它锁或更新锁的时间也就越长，从而堵塞了其它活动并可能导致死锁。</span></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">保持事务在一个批处理中，可以最小化事务的网络通信往返量，减少完成事务可能的延迟并释放锁。</span></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">使用低隔离级别</span></strong></p>
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取（未修改）的数据，而不必等待第一个事务完成。使用较低的隔离级别（例如提交读）而不使用较高的隔离级别（例如可串行读）可以缩短持有共享锁的时间，从而降低了锁定争夺。</span></p>
<br />
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">使用绑定连接</span></strong></p>
<br />
<p style="line-height: 200%; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有，反之亦然，因此不会相互阻塞</span></p>
<br />
<p style="line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 12pt; color: #006699; line-height: 150%; font-family: 宋体;">检测死锁</span></strong></p>
<br />
<p style="line-height: 200%;" class="MsoNormal"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">如果发生死锁了，我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程？</span></p>
<br />
<p style="line-height: 200%;" class="MsoNormal"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">这时我们可以使用以下存储过程来检测，就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。</span></p>
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">use</span><span style="color: #000000;"> master<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">create</span><span style="color: #0000ff;">procedure</span><span style="color: #000000;"> sp_who_lock<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">as</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">begin</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">declare</span><span style="color: #008000;">@spid</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;">,</span><span style="color: #008000;">@bl</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #008000;">@intTransactionCountOnEntry</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #008000;">@intRowcount</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #008000;">@intCountProperties</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #008000;">@intCounter</span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">create</span><span style="color: #0000ff;">table</span><span style="color: #000000;"> #tmp_lock_who (<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> id </span><span style="font-weight: bold; color: #000000;">int</span><span style="color: #ff00ff;">identity</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">1</span><span style="color: #000000;">,</span><span style="font-weight: bold; color: #800000;">1</span><span style="color: #000000;">),<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> spid </span><span style="font-weight: bold; color: #000000;">smallint</span><span style="color: #000000;">,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> bl </span><span style="font-weight: bold; color: #000000;">smallint</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">IF</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #808080;">&lt;&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #0000ff;">RETURN</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">insert</span><span style="color: #0000ff;">into</span><span style="color: #000000;"> #tmp_lock_who(spid,bl) </span><span style="color: #0000ff;">select</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"> ,blocked<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />   </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">select</span><span style="color: #808080;">*</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> sysprocesses </span><span style="color: #0000ff;">where</span><span style="color: #000000;">  blocked</span><span style="color: #808080;">&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"> ) a <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />   </span><span style="color: #0000ff;">where</span><span style="color: #808080;">not</span><span style="color: #808080;">exists</span><span style="color: #000000;">(</span><span style="color: #0000ff;">select</span><span style="color: #808080;">*</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">select</span><span style="color: #808080;">*</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> sysprocesses </span><span style="color: #0000ff;">where</span><span style="color: #000000;">  blocked</span><span style="color: #808080;">&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"> ) b <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />   </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> a.blocked</span><span style="color: #808080;">=</span><span style="color: #000000;">spid)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />   </span><span style="color: #0000ff;">union</span><span style="color: #0000ff;">select</span><span style="color: #000000;"> spid,blocked </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> sysprocesses </span><span style="color: #0000ff;">where</span><span style="color: #000000;">  blocked</span><span style="color: #808080;">&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">IF</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #808080;">&lt;&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #0000ff;">RETURN</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #000000;"> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008080;">--</span><span style="color: #008080;"> 找到临时表的记录数</span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">select</span><span style="color: #008000;">@intCountProperties</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">Count</span><span style="color: #000000;">(</span><span style="color: #808080;">*</span><span style="color: #000000;">),</span><span style="color: #008000;">@intCounter</span><span style="color: #808080;">=</span><span style="font-weight: bold; color: #800000;">1</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> #tmp_lock_who<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">IF</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #808080;">&lt;&gt;</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #0000ff;">RETURN</span><span style="font-weight: bold; color: #008000;">@@ERROR</span><span style="color: #000000;"> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">if</span><span style="color: #008000;">@intCountProperties</span><span style="color: #808080;">=</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />  </span><span style="color: #0000ff;">select</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">现在没有阻塞和死锁信息</span><span style="color: #ff0000;">'</span><span style="color: #0000ff;">as</span><span style="color: #000000;"> message<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008080;">--</span><span style="color: #008080;"> 循环开始</span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">while</span><span style="color: #008000;">@intCounter</span><span style="color: #808080;">&lt;=</span><span style="color: #008000;">@intCountProperties</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">begin</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008080;">--</span><span style="color: #008080;"> 取第一条记录</span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">select</span><span style="color: #008000;">@spid</span><span style="color: #808080;">=</span><span style="color: #000000;"> spid,</span><span style="color: #008000;">@bl</span><span style="color: #808080;">=</span><span style="color: #000000;"> bl<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />  </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> #tmp_lock_who </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> Id </span><span style="color: #808080;">=</span><span style="color: #008000;">@intCounter</span><span style="color: #000000;"> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">begin</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />  </span><span style="color: #0000ff;">if</span><span style="color: #008000;">@spid</span><span style="color: #808080;">=</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />            </span><span style="color: #0000ff;">select</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">引起数据库死锁的是: </span><span style="color: #ff0000;">'</span><span style="color: #808080;">+</span><span style="color: #ff00ff;">CAST</span><span style="color: #000000;">(</span><span style="color: #008000;">@bl</span><span style="color: #0000ff;">AS</span><span style="font-weight: bold; color: #000000;">VARCHAR</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">进程号,其执行的SQL语法如下</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />            </span><span style="color: #0000ff;">select</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">进程号SPID：</span><span style="color: #ff0000;">'</span><span style="color: #808080;">+</span><span style="color: #ff00ff;">CAST</span><span style="color: #000000;">(</span><span style="color: #008000;">@spid</span><span style="color: #0000ff;">AS</span><span style="font-weight: bold; color: #000000;">VARCHAR</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">))</span><span style="color: #808080;">+</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">被</span><span style="color: #ff0000;">'</span><span style="color: #808080;">+</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">进程号SPID：</span><span style="color: #ff0000;">'</span><span style="color: #808080;">+</span><span style="color: #ff00ff;">CAST</span><span style="color: #000000;">(</span><span style="color: #008000;">@bl</span><span style="color: #0000ff;">AS</span><span style="font-weight: bold; color: #000000;">VARCHAR</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">10</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">阻塞,其当前进程执行的SQL语法如下</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">DBCC</span><span style="color: #000000;"> INPUTBUFFER (</span><span style="color: #008000;">@bl</span><span style="color: #000000;"> )<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="color: #0000ff;">end</span><span style="color: #000000;"> <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008080;">--</span><span style="color: #008080;"> 循环指针下移</span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">set</span><span style="color: #008000;">@intCounter</span><span style="color: #808080;">=</span><span style="color: #008000;">@intCounter</span><span style="color: #808080;">+</span><span style="font-weight: bold; color: #800000;">1</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">end</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">drop</span><span style="color: #0000ff;">table</span><span style="color: #000000;"> #tmp_lock_who<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">return</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">end</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></div>
<br />
<br />
<p style="line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 12pt; color: #006699; line-height: 150%; font-family: 宋体;">杀死锁和进程</span></strong></p>
<br />
<p style="line-height: 200%;" class="MsoNormal"><span style="font-size: 10pt; line-height: 200%; font-family: 宋体;">如何去手动的杀死进程和锁？最简单的办法，重新启动服务。但是这里要介绍一个存储过程，通过显式的调用，可以杀死进程和锁。</span></p>
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">use</span><span style="color: #000000;"> master<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">if</span><span style="color: #808080;">exists</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">select</span><span style="color: #808080;">*</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> dbo.sysobjects </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> id </span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(N</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">[dbo].[p_killspid]</span><span style="color: #ff0000;">'</span><span style="color: #000000;">) </span><span style="color: #808080;">and</span><span style="color: #ff00ff;">OBJECTPROPERTY</span><span style="color: #000000;">(id, N</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IsProcedure</span><span style="color: #ff0000;">'</span><span style="color: #000000;">) </span><span style="color: #808080;">=</span><span style="font-weight: bold; color: #800000;">1</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">drop</span><span style="color: #0000ff;">procedure</span><span style="color: #ff0000;">[</span><span style="color: #ff0000;">dbo</span><span style="color: #ff0000;">]</span><span style="color: #000000;">.</span><span style="color: #ff0000;">[</span><span style="color: #ff0000;">p_killspid</span><span style="color: #ff0000;">]</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">GO</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">create</span><span style="color: #0000ff;">proc</span><span style="color: #000000;"> p_killspid<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">@dbname</span><span style="font-weight: bold; color: #000000;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">200</span><span style="color: #000000;">)    </span><span style="color: #008080;">--</span><span style="color: #008080;">要关闭进程的数据库名</span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">as</span><span style="color: #000000;">  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">declare</span><span style="color: #008000;">@sql</span><span style="font-weight: bold; color: #000000;">nvarchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">500</span><span style="color: #000000;">)  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">declare</span><span style="color: #008000;">@spid</span><span style="font-weight: bold; color: #000000;">nvarchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">declare</span><span style="color: #000000;"> #tb </span><span style="color: #0000ff;">cursor</span><span style="color: #0000ff;">for</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #0000ff;">select</span><span style="color: #000000;"> spid</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">cast</span><span style="color: #000000;">(spid </span><span style="color: #0000ff;">as</span><span style="font-weight: bold; color: #000000;">varchar</span><span style="color: #000000;">(</span><span style="font-weight: bold; color: #800000;">20</span><span style="color: #000000;">)) </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> master..sysprocesses </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> dbid</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">db_id</span><span style="color: #000000;">(</span><span style="color: #008000;">@dbname</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">open</span><span style="color: #000000;"> #tb<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">fetch</span><span style="color: #0000ff;">next</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> #tb </span><span style="color: #0000ff;">into</span><span style="color: #008000;">@spid</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">while</span><span style="font-weight: bold; color: #008000;">@@fetch_status</span><span style="color: #808080;">=</span><span style="font-weight: bold; color: #800000;">0</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">begin</span><span style="color: #000000;">  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #0000ff;">exec</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">kill </span><span style="color: #ff0000;">'</span><span style="color: #808080;">+</span><span style="color: #008000;">@spid</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />        </span><span style="color: #0000ff;">fetch</span><span style="color: #0000ff;">next</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> #tb </span><span style="color: #0000ff;">into</span><span style="color: #008000;">@spid</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">end</span><span style="color: #000000;">  <br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">close</span><span style="color: #000000;"> #tb<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />    </span><span style="color: #0000ff;">deallocate</span><span style="color: #000000;"> #tb<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008080;">--</span><span style="color: #008080;">用法  </span><span style="color: #008080;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">exec</span><span style="color: #000000;"> p_killspid  </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">newdbpy</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></div>
<br />
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 10:36 <a href="http://www.blogjava.net/mlxlzc/articles/200806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库锁机制</title><link>http://www.blogjava.net/mlxlzc/articles/200799.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200799.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200799.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200799.html</trackback:ping><description><![CDATA[<p><strong><font color="#ff0000">自己总结经验:</font></strong><br />
1:  不管是sqlerver 还是 oracle ,insert加的都是行锁.就是说只要并行的数据不违反数据库的约束条    件, A不提交是不会阻塞 B提交的. 但如果违反了约束比如主键约束 .A 没有提交会阻塞B的提交.<br />
<br />
2:
select * from table 加的是共享锁,共享锁是在得到结果后就马上释放的,不管是直接使用sql还是 在存储过程事务中,除非你加上
select * from table holdlock 这样的话要 commit tran才释放 <br />
S锁.<br />
<br />
3:  这种情况也会死锁 (但容易让人忽略)<br />
begin transaction<br />
insert into test  values.....<br />
select * from test<br />
commit  tran<br />
A 获得一个IX锁 成功执行 insert .<br />
B 获得一个IX锁 成功执行 insert .<br />
A 向数据库申请一个S 锁，但是由于这时候表test已经存在一个IX锁并且属于另外一个连接因            此他只好在此等候<br />
B 向数据库申请一个S 锁，但是由于这时候表test已经存在一个IX锁并且属于另外一个连接因            此他只好在此等候<br />
死锁发生.<br />
<br />
<br />
4:  最好是保证资源的顺序访问,就是说A 先操作table1 再操作 table2 .那么B也要先操作table1 再操     作 table2.可以放置阻塞和死锁.<br />
<br />
5: update 加的是排他锁.提交之前..select * from  table 共享锁也要等待.</p>
<p>6: 存储过程中的语句默认不会是一个事务 除非你加上 begin transaction&nbsp; commit&nbsp; tran&nbsp;</p>
<p><font color="#ff0000"><strong>锁信息</strong></font></p>
<p>  共享   (S)   用于不更改或不更新数据的操作（只读操作），如   SELECT   语句。      <br />
更新   (U)   用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常    见形式的死锁。      <br />
排它   (X)   用于数据修改操作，例如   INSERT、UPDATE   或   DELETE。确保不会同时对同一资源    进行多重更新。      <br />
意向   用于建立锁的层次结构。意向锁的类型为：意向共享   (IS)、意向排它   (IX)   以及与意向排它共   享   (SIX)。      <br />
架构   在执行依赖于表架构的操作时使用。架构锁的类型为：架构修改   (Sch-M)   和架构稳定性         (Sch -S)。      <br />
大容量更新   (BU)   向表中大容量复制数据并指定了   TABLOCK   提示时使用。 </p>
<p>共享锁   <br />
共享   (S)   锁允许并发事务读取   (SELECT)   一个资源。资源上存在共享   (S)
锁时，任何其它事务都不能修改数据。一旦已经读取数据，便立即释放资源上的共享   (S)
锁，除非将事务隔离级别设置为可重复读或更高级别，或者在事务生存周期内用锁定提示保留共享   (S)   锁。   <br />
<br />
更新锁   <br />
更新   (U)   锁可以防止通常形式的死锁。一般更新模式由一个事务组成，此事务读取记录，获取资源（页或行）的共享   (S)
锁，然后修改行，此操作要求锁转换为排它   (X)
锁。如果两个事务获得了资源上的共享模式锁，然后试图同时更新数据，则一个事务尝试将锁转换为排它   (X)
锁。共享模式到排它锁的转换必须等待一段时间，因为一个事务的排它锁与其它事务的共享模式锁不兼容；发生锁等待。第二个事务试图获取排它   (X)
锁以进行更新。由于两个事务都要转换为排它   (X)   锁，并且每个事务都等待另一个事务释放共享模式锁，因此发生死锁。   <br />
<br />
若要避免这种潜在的死锁问题，请使用更新   (U)   锁。一次只有一个事务可以获得资源的更新   (U)   锁。如果事务修改资源，则更新   (U)   锁转换为排它   (X)   锁。否则，锁转换为共享锁。   <br />
<br />
排它锁   <br />
排它   (X)   锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它   (X)   锁锁定的数据。   <br />
<br />
意向锁   <br />
意向锁表示   SQL   Server   需要在层次结构中的某些底层资源上获取共享   (S)   锁或排它   (X)
锁。例如，放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享   (S)
锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它   (X)   锁。意向锁可以提高性能，因为   SQL   Server
仅在表级检查意向锁来确定事务是否可以</p>
<p>安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。   <br />
<br />
意向锁包括意向共享   (IS)、意向排它   (IX)   以及与意向排它共享   (SIX)。   <br />
<br />
锁模式   描述      <br />
意向共享   (IS)   通过在各资源上放置   S   锁，表明事务的意向是读取层次结构中的部分（而不是全部）底层资源。      <br />
意向排它   (IX)   通过在各资源上放置   X   锁，表明事务的意向是修改层次结构中的部分（而不是全部）底层资源。IX   是   IS   的超集。      <br />
与意向排它共享   (SIX)   通过在各资源上放置   IX
锁，表明事务的意向是读取层次结构中的全部底层资源并修改部分（而不是全部）底层资源。允许顶层资源上的并发   IS   锁。例如，表的
SIX   锁在表上放置一个   SIX   锁（允许并发   IS   锁），在当前所修改页上放置   IX   锁（在已修改行上放置
X   锁）。虽然每个资源在一段时间内只能有一个   SIX   锁，以防止其它事务对资源进行更新，但是其它事务可以通过获取表级的   IS
锁来读取层次结构中的底层资源。     <br />
<br />
<br />
架构锁   <br />
执行表的数据定义语言   (DDL)   操作（例如添加列或除去表）时使用架构修改   (Sch-M)   锁。   <br />
<br />
当编译查询时，使用架构稳定性   (Sch-S)   锁。架构稳定性   (Sch-S)   锁不阻塞任何事务锁，包括排它   (X)
锁。因此在编译查询时，其它事务（包括在表上有排它   (X)   锁的事务）都能继续运行。但不能在表上执行   DDL   操作。   <br />
<br />
大容量更新锁   <br />
当将数据大容量复制到表，且指定了   TABLOCK   提示或
者使用   sp_tableoption   设置了   table   lock   on   bulk   表选项时，将使用大容量更新
(BU)   锁。大容量更新   (BU)   锁允许进程将数据并发地大容量复制到同一表，同时防止其它不进行大容量复制数据的进程访问该表。
</p>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2008-05-16 10:31 <a href="http://www.blogjava.net/mlxlzc/articles/200799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>