<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_遗忘海岸</title><subtitle type="text">江湖程序员-Feiph(LM战士)</subtitle><id>http://feed.cnblogs.com/blog/u/27996/rss</id><updated>2012-01-17T01:50:33Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/27996/rss"/><entry><id>http://www.cnblogs.com/wdfrog/archive/2012/01/17/2324257.html</id><title type="text">浅谈数据库事务</title><summary type="text">该问讲述了本人对数据库事务的一些理解，欢迎大家进来交流或拍砖。</summary><published>2012-01-17T00:39:00Z</published><updated>2012-01-17T00:39:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2012/01/17/2324257.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2012/01/17/2324257.html"/><content type="html">&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;该问讲述了我对数据库事务的一些理解，由于本人才疏学浅，无法保证这些内容的正确性望各位明鉴，希望能够误导你，哦是帮到你！&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;文章后面列出了一些大牛的文章，供大家参考。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;事务的定义&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 啥是数据库事务?事务就是&amp;hellip;.,(此处略去200字)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一个事务的典型例子(中西结合版)&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp; Mr张三给Mr李四转帐&amp;hellip;.(此出略去1000字)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;到底嘛是事务&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面分别给出了事务的定义与一个典型场境，相信无论你是菜鸟还是小鸟看到上面这段文时时都会笑而不语 (嘿嘿&amp;hellip;&amp;hellip;&amp;hellip;哥在这里已经看见你们邪恶的表情了),好了下面我们来点别的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;测试如下问题:&lt;/em&gt;&lt;br /&gt;&amp;nbsp; 有一张表MyTable有100万条记录，假设使用Delete语句执行删除全部记录要20分钟，你在查询分析器里输入如下代码 &amp;ldquo;Delete From MyTable&amp;rdquo; 然后按F5, 执行5分钟左右你把电源拔了（注意这个动作要猛、准、狠）. 问题是:当你重新启动电脑后，你的MyTable表里还有多少记录呢？&lt;/p&gt;&#xD;
&lt;p&gt;&amp;hellip;&amp;hellip;&amp;hellip;&lt;br /&gt;&amp;hellip;&amp;hellip;&amp;hellip;.&lt;br /&gt;哥在这里休息5分钟再写,以便您能完成上面的测试&amp;hellip;&lt;br /&gt;&amp;hellip;&amp;hellip;&amp;hellip;&lt;br /&gt;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;..&lt;br /&gt;您好！很高兴您成功启动了电脑，如果一切正常（关于太阳带电粒子的问题我们这里先不考虑）您的MyTable表中应该还有100万条记录。&lt;br /&gt;这就是传说中的&lt;span style="color: #ff0000;"&gt;原子性--A&lt;/span&gt;,要么全部删完，要么一条多没删除，顺便提下你的任何SQL 即使没加Begin Tran 都是在事务环境下远行的，因为上面那个转帐的例子导致哥许多年来天真的认为不加Begin Tran的SQL语句是没有事务的，其实&lt;br /&gt;Delete From MyTable &lt;br /&gt;跟&lt;br /&gt;Begin Tran&lt;br /&gt;&amp;nbsp; Delete from Mytable&lt;br /&gt;&amp;nbsp; If @@Error &amp;gt;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rollback;&lt;br /&gt;Coomit;&lt;br /&gt;是等价的，前一个语句就是那个天杀的SQL自动事务模式.&amp;nbsp;好了我们继续，您在次输入 Delete From MyTable，注意饿（请确保您的MyTable表中有100万条记录），不然一下就删除没了。&lt;br /&gt;然后新开个查询窗口输入Select * from MyTableA, 接着F5运行，你会发现运行正常，查询语句显示MyTableA表中的28条记录，注意我上面说的是MyTableA, 如果这个时候你执行Select * From MyTable 会显示什么呢&amp;hellip;答案是啥都没有，只显示[正在执行查询....]直接到您的Delete完成，然后显示的结果是没有任何记录的MyTable表。&lt;br /&gt;这就是所谓的&lt;span style="color: #ff0000;"&gt;隔离性-I&lt;/span&gt;,注意上面的Select * From MyTable也是在事务环境下运行的，别拿查询不当事务饿，而上面的操作我们模拟了两个并发运行的事务，在Delete完成或取消前，&lt;br /&gt;Select被挡在了外面，以免您的Select语句整出54万条或别的什么数目的记录来。&lt;br /&gt;对数据库来说你执行Delete* From MyTable,后只会有两种结果，成功或失败，如果执行成功，那么在执行删除前语句Select * From MyTable应该显示100万，而在删除执行后所有的查询只能看到0条记录，就是不允许你看到它删除中的54万或38万条记录什么的,这就体现了&lt;span style="color: #ff0000;"&gt;一致性-C&lt;/span&gt;,这个比较抽象请先忽略掉把。&lt;br /&gt;好了说下&lt;span style="color: #ff0000;"&gt;持久性-D&lt;/span&gt;,说到持久我们就会想到硬盘，我们上面的Delete语句执行后被删除的数据就应该从.mdf文件中清除以实现持久化，不过在执行删除前后对比.mdf文件大小您可能要失望了，您会发现.mdf没有变小甚至可能变大，造成功这个现象的原因是，数据库文件是按8K一页为单位来组织管理的，数据库记录就写在这些页上，在您删除数据后这些页面没有被删除或者说将磁盘空间还给操作系统，只是将这些页标记为空以便以后使用，不过您确实能观察到.ldf文件变大了。ACID（事务）,可以看作是关系数据库的一个标准，就像HTML一样，比方w3c定义了一个A标签，那么你做浏览器开发的就要在程序上实现对a标签的支持,而通常来说关系数据库产品要实现ACID标准一般多是通过&amp;rdquo;日志&amp;rdquo;与&amp;rdquo;锁&amp;rdquo;技术。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;现在我们来大致来整理下删除的具体过程&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.查询语句解析:数据库接到您的删除命令后计算出这次删除要涉及的数据或记录（页面）&lt;br /&gt;2.读取对应页面到缓存并锁定:数据库引擎会读取这些页面并加上工享锁，防止它事务（也就是其他人）进行写操作。&lt;br /&gt;3.写日志:将这些将被删除页面做个备份写到log中（这个操作是真真切切要先搞完的），&lt;br /&gt;4.获取排它锁禁止其它进程的一切读写操作，这步完成时就是你看到上面那个Select 一直处于执行中的原因了.&lt;br /&gt;4.修改缓存中的页面，并记录事务点到日志中,释放排它锁&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;至于缓存的页面啥时候写到.mdf中就不是事务要关心的事情了，反正读写数据都是针对缓存来说,而缓存与数据库文件之间的一致性，也是通过日志和一个叫检查点的机制来实现的。&lt;/p&gt;&#xD;
&lt;p&gt;好了针对上面的执行模型再考虑我们那100万条记录的删除情况，当执行到5分钟时根本没到事务提交点（.ldf中没记录这次删除完成的点），因此当您重新启动电脑后，数据库服务器会根据日志进行一致性检测，根据日志，将上面那个删除了一半的操作撤消（因为日志里保存了删除的页面，如果有必要系统会据此来还原数据），当然如果您在执行了19分59秒时把电源拔了那么事务可能已经完成并提交了，但是缓存中的页面没写入.mdf，不过这个也不是问题，根据日志文件的记录，数据库会再做一次&amp;ldquo;删除&amp;rdquo;，以保证.mdf处于一直状态，为了避免干扰在完成这些工作前您是无法访问数据库的，当然数据库在进行上面的操作时也会写日志，防止某些变态的人又突然把电源拔掉。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;下面我们看下另外一个场景&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有个卖火车票的网站，上面有个可卖火车票的列表，有很多群众不停的刷新，一旦发现他要的票，就双击进入购卖详细页(ticketDetail.aspx)然后[提交购买]。&lt;br /&gt;好了那个数据表是 : ticket(Id,status,buyerId,&amp;hellip;.),字段说明：车票编号、状态(可买，已买)、购买者编号.&lt;/p&gt;&#xD;
&lt;p&gt;[提交购买]对应的操作是&lt;br /&gt;Update ticket status=&amp;rsquo;已买&amp;rsquo;,buyerId=@buyerId where Id=@Id&lt;/p&gt;&#xD;
&lt;p&gt;聪明绝顶的你一看这个可能不行的，这一语句的问题是没检测车票是否已被卖出，这样后面的提交的总是覆盖掉前面的提交。&lt;/p&gt;&#xD;
&lt;p&gt;改进一&lt;/p&gt;&#xD;
&lt;p&gt;If (Select count(*) from ticket where status=&amp;rsquo;可买&amp;rsquo; and Id=@Id )=1 &lt;br /&gt;Update ticket status=&amp;rsquo;已买&amp;rsquo;,buyerId=@buyerId where Id=@Id&lt;/p&gt;&#xD;
&lt;p&gt;但是由于群众太多上面的代码有些时候会出问题，张三，李四，王五他们同时买Id=1的车票，页面提示他们全都购买成功了，不过最后事实是李四拿到了票，因为buyerId记录了李四的编号。&lt;/p&gt;&#xD;
&lt;p&gt;改进二&lt;br /&gt;Update ticket status=&amp;rsquo;已买&amp;rsquo; ,buyerId=@buyerId where Id=@Id and @status=&amp;rsquo;可买&amp;rsquo; &lt;br /&gt;我们通过update 返回值是否 &amp;gt;0来判断是否购买成功，这个方案加入了版本控制字段status(SQL2005中可以使用timestamp来达到同样的目的),而且语句只有一句了。&lt;br /&gt;现在我们分析下&lt;br /&gt;当张三跟李四同时提交时，出现了A,B两个并发事务,&lt;br /&gt;缓存中首先加载where条件对应的数据页，并将更新锁分配给A或B中的一个，这里假设是A获得了更新锁（更新锁之间互不兼容）&lt;br /&gt;A将U锁升级成X锁完成更新操作。而B在A进程完成后再次尝试获取对应where条件的数据页的更新锁，但是无法找到对应条件的数据页了，因此更新失败。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一写参考资料&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;MSSQL体系结构介绍&lt;br /&gt;&lt;a href="http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html" target="_blank"&gt;http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于数据库索引&lt;br /&gt;&lt;a href="http://www.codinglabs.org/html/theory-of-mysql-index.html" target="_blank"&gt;http://www.codinglabs.org/html/theory-of-mysql-index.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于数据库事务&lt;br /&gt;&lt;a href="http://www.cnblogs.com/hustcat/archive/2009/02/14/1390731.html" target="_blank"&gt;http://www.cnblogs.com/hustcat/archive/2009/02/14/1390731.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/hustcat/archive/2009/02/26/1398558.html" target="_blank"&gt;http://www.cnblogs.com/hustcat/archive/2009/02/26/1398558.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.csdn.net/happyflystone/article/details/4604573" target="_blank"&gt;http://blog.csdn.net/happyflystone/article/details/4604573&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/lxconan/archive/2011/10/20/2218396.html" target="_blank"&gt;http://www.cnblogs.com/lxconan/archive/2011/10/20/2218396.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011709495556.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2324257.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2012/01/17/2324257.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2012/01/14/2322527.html</id><title type="text">一些数据库资料整理</title><summary type="text">MSSQL体系结构介绍http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html关于数据库索引http://www.codinglabs.org/html/theory-of-mysql-index.html关于数据库事务http://www.cnblogs.com/hustcat/archive/2009/02/14/1390731.htmlhttp://www.cnblogs.com/hustcat/archive/2009/02/26/1398558.htmlhttp://blog.csdn.net/happyfl</summary><published>2012-01-14T11:28:00Z</published><updated>2012-01-14T11:28:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2012/01/14/2322527.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2012/01/14/2322527.html"/><content type="html">&lt;p&gt;MSSQL体系结构介绍&lt;br /&gt;&lt;a href="http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html" target="_blank"&gt;http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于数据库索引&lt;br /&gt;&lt;a href="http://www.codinglabs.org/html/theory-of-mysql-index.html" target="_blank"&gt;http://www.codinglabs.org/html/theory-of-mysql-index.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于数据库事务&lt;br /&gt;&lt;a href="http://www.cnblogs.com/hustcat/archive/2009/02/14/1390731.html" target="_blank"&gt;http://www.cnblogs.com/hustcat/archive/2009/02/14/1390731.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/hustcat/archive/2009/02/26/1398558.html" target="_blank"&gt;http://www.cnblogs.com/hustcat/archive/2009/02/26/1398558.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.csdn.net/happyflystone/article/details/4604573" target="_blank"&gt;http://blog.csdn.net/happyflystone/article/details/4604573&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/lxconan/archive/2011/10/20/2218396.html" target="_blank"&gt;http://www.cnblogs.com/lxconan/archive/2011/10/20/2218396.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2322527.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2012/01/14/2322527.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2012/01/11/2318695.html</id><title type="text">人事系统---工资模块设计</title><summary type="text">摘要:列出了一个针对生产型企业,工资生成模块的初步设计,希望有个抛砖引玉的效果^_^1.背景一个生产型企业，工资按月发放，工资主要分成计件工资(生产线员工)、考勤工资(后勤，行政等人员)两中，外加一些福利报酬，计件工资原始数据来自多张生产报表，考勤工资涉及考勤记录,福利报酬一般由工资制作员指定，涉及一些基本配置表2.总统设计2.1主要用例2.2流程2.3状态图将审核失败分成全部失败与部分失败.全部失败:允许制作人员删除全部重新生产，审核人员需要全部重审部分失败:工资表制作人员只能针对失败的记录进行重新编制，这样减轻了审核人员的工作量2.4数据库5张生产报表一月共用20来万条记录，每条记录根据字</summary><published>2012-01-11T00:48:00Z</published><updated>2012-01-11T00:48:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2012/01/11/2318695.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2012/01/11/2318695.html"/><content type="html">&lt;p&gt;摘要:列出了一个针对生产型企业,工资生成模块的初步设计,希望有个抛砖引玉的效果^_^&lt;/p&gt;&#xD;
&lt;p&gt;1.背景&lt;/p&gt;&#xD;
&lt;p&gt;一个生产型企业，工资按月发放，工资主要分成计件工资(生产线员工)、考勤工资(后勤，行政等人员)两中，外加一些福利报酬，计件工资原始数据来自多张生产报表，考勤工资涉及考勤记录,福利报酬一般由工资制作员指定，涉及一些基本配置表&lt;/p&gt;&#xD;
&lt;p&gt;2.总统设计&lt;/p&gt;&#xD;
&lt;p&gt;2.1主要用例&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011109324631.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.2流程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011108594867.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.3状态图&lt;/p&gt;&#xD;
&lt;p&gt;将审核失败分成全部失败与部分失败.&lt;br /&gt;全部失败:允许制作人员删除全部重新生产，审核人员需要全部重审&lt;br /&gt;部分失败:工资表制作人员只能针对失败的记录进行重新编制，这样减轻了审核人员的工作量&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011109045683.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.4数据库&lt;/p&gt;&#xD;
&lt;p&gt;5张生产报表一月共用20来万条记录，每条记录根据字段的组合可能有多个工资计算公式&lt;br /&gt;工序价格表里保存的是工资计算公式中用到的一些参变量.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011109292439.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.具体设计&lt;/p&gt;&#xD;
&lt;p&gt;3.1生成引擎类图&lt;/p&gt;&#xD;
&lt;p&gt;由于计算规则经常变动，这部分逻辑考虑使用脚本实现(IronPython）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011109430581.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.2计件工资生成流程&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/24437/2012011109512844.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2318695.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2012/01/11/2318695.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2012/01/08/2316447.html</id><title type="text">PB中的大数据量插入操作测试</title><summary type="text">计算工资是需要根据生产记录，逐条计算，并插入另外一张计算结果表，生产报表一个月有20来万条方法一(A)PB中使用直接SQL 每条Insert后跟Commit,3000条记录测试结果是23719耗秒.(B)PB中使用直接SQL 每100条后跟Commit,3000条记录测试结果是15780耗秒.方法二使用DataWidnow,当dw_1.rowcount()中满100条记录时执行一次dw_1.update(),3000条记录测试结果是3516耗秒方法三(A)使用存储过程，PB中使用Execute Immediate :sql; commit; 3000条记录测试结果是10240耗秒.(B)使用存</summary><published>2012-01-08T07:25:00Z</published><updated>2012-01-08T07:25:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2012/01/08/2316447.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2012/01/08/2316447.html"/><content type="html">&lt;p&gt;计算工资是需要根据生产记录，逐条计算，并插入另外一张计算结果表，生产报表一个月有20来万条&lt;/p&gt;&#xD;
&lt;p&gt;方法一&lt;/p&gt;&#xD;
&lt;p&gt;(A)&lt;/p&gt;&#xD;
&lt;p&gt;PB中使用直接SQL 每条Insert后跟Commit&amp;nbsp;,3000条记录测试结果是23719耗秒.&lt;/p&gt;&#xD;
&lt;p&gt;(B)&lt;/p&gt;&#xD;
&lt;p&gt;PB中使用直接SQL 每100条后跟Commit,3000条记录测试结果是15780耗秒.&lt;/p&gt;&#xD;
&lt;p&gt;方法二&lt;/p&gt;&#xD;
&lt;p&gt;使用DataWidnow,当dw_1.rowcount()中满100条记录时执行一次dw_1.update(),3000条记录测试结果是3516耗秒&lt;/p&gt;&#xD;
&lt;p&gt;方法三&lt;/p&gt;&#xD;
&lt;p&gt;(A)&lt;/p&gt;&#xD;
&lt;p&gt;使用存储过程，PB中使用Execute Immediate :sql; commit; 3000条记录测试结果是10240耗秒.&lt;/p&gt;&#xD;
&lt;p&gt;(B)&lt;/p&gt;&#xD;
&lt;p&gt;使用存储过程,PB中使用Execute Immediate :sql; 每100条记录Commit;一次，3000条记录测试结果3750耗秒&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结论，直接SQL每次需要动态编译故消耗较多时间，使用存储过程并多条插入语句执行一次事务提交性能跟使用dw_1类似,相对来说使用dw_1编程比较方便。不过需要注意设置SQLCA.autoCommit=fasle。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2316447.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2012/01/08/2316447.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/12/30/2307957.html</id><title type="text">PB中设置SQLCA.AutoCommit = False的说明</title><summary type="text">前提:设置AutoCommit=false1.执行数据库操作（sql语句,dw.update等）后需要自己调用commit;不然在断开链接时pb会默认调用rollback;导致操作未能保存.2.sqlca.sqlcode,的值记录的是最近一次执行的sql语句后的状态，如果有多个sql语句如下execute sql1 --执行时发生错误execute sql2 --执行时发生错误execute sql3 --正确show-&amp;gt;(sqlca.sqlcode)那么上面显示的 sqlca.sqlcode 是03.调用commit;或rollback后 sqlca.sqlcode被重置成0execu</summary><published>2011-12-30T12:49:00Z</published><updated>2011-12-30T12:49:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/12/30/2307957.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/12/30/2307957.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;前提:设置AutoCommit=false&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.执行数据库操作（sql语句,dw.update等）后需要自己调用commit;不然在断开链接时pb会默认调用rollback;导致操作未能保存.&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.sqlca.sqlcode,的值记录的是最近一次执行的sql语句后的状态，如果有多个sql语句如下&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;execute sql1 --执行时发生错误&lt;/p&gt;&#xD;
&lt;p&gt;execute sql2 --执行时发生错误&lt;/p&gt;&#xD;
&lt;p&gt;execute sql3 --正确&lt;/p&gt;&#xD;
&lt;p&gt;show-&amp;gt;(sqlca.sqlcode)&lt;/p&gt;&#xD;
&lt;p&gt;那么上面显示的 sqlca.sqlcode 是0&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.调用commit;或rollback后 sqlca.sqlcode被重置成0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;execute sql1 --执行时发生错误&lt;/p&gt;&#xD;
&lt;p&gt;commit; //或者rollback&lt;/p&gt;&#xD;
&lt;p&gt;show-&amp;gt;(sqlca.sqlcode) 显示的0&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2307957.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/12/30/2307957.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/12/28/2304271.html</id><title type="text">PB代码块</title><summary type="text">调整菜单与工具栏:m_mat.m_file.m_nowrow.text=&amp;quot;维护&amp;amp;(M)&amp;quot;;m_mat.m_file.m_nowrow.visible=true;m_mat.m_file.m_nowrow.ToolBarItemText=&amp;quot;维护&amp;quot;;</summary><published>2011-12-28T01:23:00Z</published><updated>2011-12-28T01:23:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/12/28/2304271.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/12/28/2304271.html"/><content type="html">&lt;p&gt;调整菜单与工具栏:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;m_mat.m_file.m_nowrow.text="维护&amp;amp;(M)";&#xD;
m_mat.m_file.m_nowrow.visible=true;&#xD;
m_mat.m_file.m_nowrow.ToolBarItemText="维护";&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2304271.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/12/28/2304271.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303149.html</id><title type="text">T-SQL时间格式化显示</title><summary type="text">SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06SELECT CONVERT(varchar(100), GETDATE(), 4): 16.05.06SELECT CONVERT(varchar(100), G</summary><published>2011-12-27T02:53:00Z</published><updated>2011-12-27T02:53:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303149.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303149.html"/><content type="html">&lt;div &gt;&#xD;
&lt;pre &gt;SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 4): 16.05.06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 5): 16-05-06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 6): 16 05 06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 7): 05 16, 06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 8): 10:57:46&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 10): 05-16-06&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 11): 06/05/16&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 12): 060516&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 23): 2006-05-16&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 24): 10:57:47&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 101): 05/16/2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 102): 2006.05.16&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 103): 16/05/2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 104): 16.05.2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 105): 16-05-2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 106): 16 05 2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 108): 10:57:49&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 110): 05-16-2006&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 111): 2006/05/16&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 112): 20060516&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM&#xD;
SELECT CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM &#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2303149.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303149.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303071.html</id><title type="text">游标，存储过程，以及临时表</title><summary type="text">遍历Select存储过程的集合</summary><published>2011-12-27T02:03:00Z</published><updated>2011-12-27T02:03:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303071.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303071.html"/><content type="html">&lt;p&gt;需要在SQL端实现业务逻辑,NND (-_-")&lt;/p&gt;&#xD;
&lt;p&gt;代码一:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;ALTER proc [dbo].[tt_select]&#xD;
@Id bigint&#xD;
as&#xD;
select PlanId,FGPartNo,p_FGName from backflush where Id&amp;lt;@Id&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;代码二:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;Declare @Id bigint&#xD;
Set @Id=12&#xD;
&#xD;
Declare @PlanId nvarchar(100),@FGPartNo nvarchar(100),@FGName nvarchar(100)&#xD;
&#xD;
--确保临时表已经被删除了&#xD;
IF object_id('tempdb..#t_bf_tmp') IS NOT NULL&#xD;
  Begin&#xD;
    Drop Table #t_bf_tmp&#xD;
  End&#xD;
&#xD;
--定义临时表&#xD;
Create Table #t_bf_tmp&#xD;
(&#xD;
  PlanId nvarchar(50),&#xD;
  FGPartNo nvarchar(50) ,&#xD;
  p_FGName nvarchar(50)&#xD;
)&#xD;
--将存储过程的执行结果添加到临时表&#xD;
Insert Into #t_bf_tmp&#xD;
Exec tt_select @Id&#xD;
&#xD;
&#xD;
--使用游标遍历临时表，并做对于处理&#xD;
Declare MyCursor Cursor&#xD;
For Select * from #t_bf_tmp&#xD;
For Read Only&#xD;
&#xD;
Open MyCursor&#xD;
&#xD;
Fetch next From MyCursor&#xD;
   Into @PlanId,@FGPartNo,@FGName&#xD;
&#xD;
while(@@FETCH_STATUS = 0)&#xD;
Begin&#xD;
 print @PlanId  &#xD;
&#xD;
 Fetch next From MyCursor&#xD;
   Into @PlanId,@FGPartNo,@FGName&#xD;
End&#xD;
&#xD;
Close MyCursor&#xD;
Deallocate MyCursor&#xD;
&#xD;
Drop Table #t_bf_tmp&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2303071.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/12/27/2303071.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/12/24/2300309.html</id><title type="text">获取指定表的字段信息sql2005</title><summary type="text">select syscolumns.name as ColName ,systypes.name as ColTypeName , syscolumns.length, sys.extended_properties.value as Mark ,syscolumns.isnullable as AllowNull ,IsPK = Case when exists ( select 1 from sysobjects inner join sysin...</summary><published>2011-12-24T06:41:00Z</published><updated>2011-12-24T06:41:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/12/24/2300309.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/12/24/2300309.html"/><content type="html">&lt;div &gt;&#xD;
&lt;pre &gt;select syscolumns.name as ColName ,&#xD;
systypes.name as ColTypeName ,&#xD;
 syscolumns.length, &#xD;
sys.extended_properties.value as Mark ,&#xD;
syscolumns.isnullable as AllowNull ,&#xD;
IsPK = Case when exists &#xD;
                       (&#xD;
                         select 1 from sysobjects &#xD;
                          inner join sysindexes &#xD;
                          on sysindexes.name = sysobjects.name &#xD;
                          inner join sysindexkeys &#xD;
                          on sysindexes.id = sysindexkeys.id and sysindexes.indid = sysindexkeys.indid where xtype='PK' and parent_obj = syscolumns.id and sysindexkeys.colid = syscolumns.colid ) &#xD;
                          then 1 &#xD;
            else 0 end ,&#xD;
IsIdentity = Case syscolumns.status when 128 then 1 else 0 end from syscolumns inner join systypes on ( syscolumns.xtype = systypes.xtype and systypes.name &amp;lt;&amp;gt;'_default_' and systypes.name&amp;lt;&amp;gt;'sysname' ) left outer join sys.extended_properties on ( sys.extended_properties.major_id=syscolumns.id and minor_id=syscolumns.colid ) &#xD;
where syscolumns.id = (select id from sysobjects where name='tmp_tt') order by syscolumns.colid&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2300309.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/12/24/2300309.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wdfrog/archive/2011/11/29/2267760.html</id><title type="text">WCF,心跳检测</title><summary type="text">文章地址:http://www.cnblogs.com/huangxincheng/archive/2011/11/13/2246934.html#2256396System.Timers.Timer是基于.Net PoolThread实现的，独立于UI线程 public void GetService(string address) { Timer timer = new Timer(); timer.Interval = 1000; timer.Elapsed += (obj, sender) =...</summary><published>2011-11-29T08:02:00Z</published><updated>2011-11-29T08:02:00Z</updated><author><name>遗忘海岸</name><uri>http://www.cnblogs.com/wdfrog/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wdfrog/archive/2011/11/29/2267760.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wdfrog/archive/2011/11/29/2267760.html"/><content type="html">&lt;p&gt;文章地址:&lt;a href="http://www.cnblogs.com/huangxincheng/archive/2011/11/13/2246934.html#2256396"&gt;http://www.cnblogs.com/huangxincheng/archive/2011/11/13/2246934.html#2256396&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/24437/2011112915572653.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;System.Timers.Timer是基于.Net PoolThread实现的，独立于UI线程&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public void GetService(string address)&#xD;
        {&#xD;
            Timer timer = new Timer();&#xD;
            timer.Interval = 1000;&#xD;
            timer.Elapsed += (obj, sender) =&amp;gt;&#xD;
            {&#xD;
                try&#xD;
                {&#xD;
                    //这个是定时的检测IIS是否挂掉&#xD;
                    var factory = new ChannelFactory&amp;lt;IServiceList&amp;gt;(new NetTcpBinding(SecurityMode.None),&#xD;
                                                                   new EndpointAddress(address));&#xD;
&#xD;
                    factory.CreateChannel().AddSearchList(search);&#xD;
&#xD;
                    factory.Close();&#xD;
&#xD;
                    timer.Interval = 10000;&#xD;
                }&#xD;
                catch (Exception ex)&#xD;
                {&#xD;
                    Console.WriteLine(ex.Message);&#xD;
                }&#xD;
            };&#xD;
            timer.Start();&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wdfrog/aggbug/2267760.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wdfrog/archive/2011/11/29/2267760.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
