日历

« 2008-12-04  
 123456
78910111213
14151617181920
21222324252627
28293031   

统计信息

  • 访问量: 1471
  • 日志数: 76
  • 文件数: 3
  • 书签数: 2
  • 建立时间: 2007-11-06
  • 更新时间: 2008-09-12

我的最新日志

  • 软件外包测试处理流程

    2008-7-25

    软件外包测试需要软件开发商和外包测试服务商密切配合,有效交流。软件开发商提供测试计划、测试要求、解答测试服务商的测试过程中的问题、指导和跟踪测试执行过程、修正软件设计缺陷,编译新的软件测试版本。

      软件外包测试服务商从开发商那里取得测试项目,分析测试需求,执行具体的测试过程,报告软件缺陷。测试服务商是软件测试活动的直接执行者。

      软件外包测试处理的流程如下图所示:

    见附件


        软件开发商通过电子邮件等方式传递软件测试要求(测试计划、测试缺陷管理和项目交流方式等),外包测试服务商指定测试项目经理分析和审阅开发上发来的测试要求,如果对测试要求有任何疑问或建议,及时告诉开发商,待开发上给出合理解释后,准备进行具体的测试过程。

      测试服务商在执行测试的过程中,对于新软件测试版本首先进行版本验证测试( Build Verified Testing - BVT ),并且把 BVT 的结果发送回软件开发商。对于软件的常规测试发现的软件缺陷,使用软件开发商提供的缺陷跟踪管理系统报告和查询。

      对于测试周期较长的软件外包测试项目,外包测试服务商需要每周(甚至每天)向软件开发商提供测试进度和测试结果等测试状态报告。测试状态报告的提交频率可以在项目开始前的准备阶段与客户确认,一般每周结束时报告一次。

      为了保证软件外包测试的有效性,外包测试服务商需要对测试结果进行内部的质量保证( QA )过程。如果没有通过内部 QA 测试,则测试服务商的测试人员需要重新或补充测试;如果通过了内部 QA 测试,则可以向软件开发商提交测试结果。

      软件开发商的软件开发人员负责每天跟踪和修正测试服务商报告的软件缺陷,然后重新编译出软件新测试版本。开发商的软件编译人员对刚编译的软件版本执行基本功能检查,这个过程称为“冒烟测试 (Smoke Testing) ”。

      如果通过了软件冒烟测试,则开发商将新的被测试版本上传到项目开始时约定的文件服务器中,并且使用电子邮件等方式通知测试服务商准备新版本测试。

      在软件项目测试后期,理想情况下软件缺陷为 0 ,则进行最终软件版本的测试,最后向开发商提交最终版本的测试结果。

    附件

    1016570.jpg (40.42 KB)

    2007-12-7 11:47

    1016570.jpg

  • ERP 项目管理感悟

    2008-7-07

     

    ERP 项目管理感悟

    古今成大事业、大学问者,必经三种境界:“昨夜西风凋碧树,独上高楼,望断天涯路。”、“衣带渐宽终不悔,为伊消得人憔悴。”、“众里寻他千百度,蓦然回首,那人却在灯火阑

    珊处”。后人归之为:知、行、得三境界。我想用它来比喻ERP项目实施所经历的心路历程倒也贴切。
            项目实施过程及成功经验,在我的另一篇文章:“天下大事做于细,从零实施ERP”中有详细叙述,这里我只想谈一下作为ERP项目经理,我个人的感悟和体会。不当之处,

    请批评指正。
     
     
           技术与管理。
     
            管理就是沟通,管理就是服务等等,只说对了一方面,却很难概括整体。很多搞技术的看不起搞管理的,认为技术是“硬功夫”,管理是打杂,谁都能干。其实,要管理的

    好,管理的妙,里面的学问大得很。技术是打固定靶,管理则是打飞靶。人形形色色,各有想法,要拢着一帮人做一件大事,里里外外、大大小小,谈何容易?管理就是在不断地

    寻求合理,但合理与否又不是固定的,因人、因事、因时空都不同,所以分寸很难拿捏。管理是一门平衡的艺术,它考验的是管理者综合的素质和能力。
     
     
            关系与人情。
     
            任何公司都有它独特的历史和文化。公司不大,每个人和老板的关系都不错,对位高权重,和领导私交甚厚的,要让他参与到项目中来,至少不能成为障碍。对这种人光

    靠行政手段是难以调动的。他们成为项目组成员,也会感到责无旁贷,我对其安排任务是名正言顺,他们可以代替我做我不便做或做不好的事。任何地方都不可能把小人赶尽杀绝

    ,因为小人总是躲在暗处。但八仙过海,各显神通,小人也有小人的用处。从老板的角度和从我们自己的角度看某些人,对“好”和“坏”的感觉是不同的。所以既要团结君子也团结

    小人,既要团结喜欢的人也要团结不喜欢的人,不管是否出于情愿。况且有人做“坏人”,领导才能做“好人”,而且领导必须要做“好人”。
     
     
            做人与做事。
     
            做事多靠能,做人多靠德。我觉得做事容易做人难,职位越高,做人比做事重要,因为他大多是通过做人来做事的。一个管理者,特别是一个领导者,“能”重要,“德”更

    重要。中国人最不喜欢被管,所以只是管和压不行,少用权,多用专业技能和人格魅力来领导,这样才能服众。职位越高,在老板心目中越重要,同样个人自由越大,责任也越大

    。在实践中,我感悟到:制度永远有管不到的地方,很多情况下完全是凭个人的责任心和忠诚度,或者说是良心在做事,你不可能每时每刻盯着他。所以,要让下属心甘情愿、自

    觉主动地做事,就必须重视思想工作和人文关怀。要琢磨人的心理,把下属当成有丰富情感和多种需求的人,而不是让他感到他只是你利用的机器和工具。
     
     
            借势和用人。
     
            ERP项目经理不可能事必躬亲,涉及的范围广了,一个人看不过来。所以,要学会借势和用人。借势为项目推进减少阻碍,因为“势”永远比“人”的力量大。借势就是要造成

    一种氛围,让别人明白上ERP是大势所趋,是老板的决策,抗拒不但徒劳而且还要受罚。作为ERP项目经理,我必须要想办法争取领导的支持,通过大会及厂报宣讲造势。势一旦造

    成,可水到渠成、事半功倍。用人就是要用人的长处,弥补自己知识或精力上的不足,以便抽出时间做更有生产力的事情。刘邦说:在帷幄中运筹划策,决胜欲千里之外,我不如

    张良;镇守国家,安抚百姓,供给军粮,畅通粮道,我不如萧何;用兵百万,战必胜,攻必克,我不如韩信。这三个人都是人中俊杰,我能任用他们,这是我取得天下的原因。所

    以,用对人、会用人,事情做得快,自己也轻松。
     
     
     
           听话和出活。
     
           人们都喜欢和自己相似的人,要完整、准确、迅速地领会领导的意图和指示,和领导的步调保持一致,这点非常重要。没有领导的信任和支持做不了事,也做不好事。领导

    的意图和指示从日常交谈,或者从他开会讲话和工作报告里获取。我觉得看下属主要看两点:听话、出活。在任何一个组织,不服从领导的,即使有才也不能要。你说东,他往西

    ,能力越强,破坏力越大。光听话不出活那是奴才,也不能要。
     
     
           授权与汇报。
     
           项目管理侧重于计划和检查,中间过程则为下属提供服务、创造条件、提供资源支持,让他们觉得自己是这个任务的主人,要让他知道要做什么,然后放手让他去做,这就

    够了。不要过多干预,除非有严重错误需要及时纠正。就象实施顾问当初告诫我的,项目经理如果我陷入业务和具体事务太深,就不能更多考虑明天的事,就不能很好地兼顾全面

    。很多人说忙顾不上或不习惯汇报,其实上级不但要结果,他同样想知道你的进度,他想有参与感和控制感。作为一个下属,要注意不要平时不沟通、不请示、不联络,事情结束

    了把结果一报了事。
     
     
           沟通与激励。
     
           沟通要注意“说什么”,而且要注意“怎么说”,关键是要让他觉得受尊重、有面子,他接纳了你的人自然就接纳你的事。这个在要求别人配合自己工作时,我深有体会。每个

    人都有自己喜欢的沟通方式,如果找准对方的特点和喜好,往往会事半功倍。其实管理就是一对一的活动。最好的激励就是给他缺少的和想要的,对想干事的人给机会,对能干事

    的人给职位,对干成事的人给实惠。在项目任务最重、压力最大的系统切换前夕,大家忙的焦头烂额,脾气都很急躁,稍不注意就会拍桌子甚至撂挑子。作为项目经理要善于鼓动

    和打气,及时发现并且控制团队的不良情绪倾向。首先自己不能慌,然后积极想办法激励大家一起克服困难,一起体验成功。
     
     
            容忍与克制。
     
           企业的大小和老板的胸怀成正比,作为一个有修养的管理者,同样要心胸宽广,能够容人、容事,常言“容得下兄弟才能当大哥”。职位越高,越要善于隐藏自己的实力,不

    要急于显露,允许并且希望下属表现比你好,不要去打压他,因为他们做的好就是你的成就。一般情况下,下属之所以是下属,能力肯定不如你。你越训斥他越做不好,多点耐心

    的指导和鼓励往往效果会更好。曾经因为BOM进度缓慢,我严厉地批评或者说训斥了当时的BOM负责人,致使很长一段时间两人产生了隔阂。凡是人都爱听好话,所以不管某人有什

    么缺点,都不要去正面批评他。1次责备会让前面99次表扬失效,在接下来很长的工作时间内,几乎无法再赢得他的完全信任。
     
     
            兼听与偏信。
            屁股决定脑袋,在实际管理中,我深深地体会到所处位置不同,看问题真的不一样。我们通常站在自己立场想问题,而领导是统筹兼顾的,他有一个全盘的考虑。看到自

    己的下属有些做的不好的地方,反观自己同样作为别人的下属,就知道如何去做才好。我从一个被管理者到管理者,很多以前想不通的问题突然想通了。做领导要广开言路,正的

    听反的也听,还要亲自调查。比如,PMC有次向我反映总装和仓库的问题,当我深入了解时,和总装与仓库的说法不一样,原来之前他们有过芥蒂。我理解为何领导不急于回应和决

    定,就是有意拖延给自己一个缓冲,以便思考和判断。
     
     

             信息化只有起点,没有终点。项目完工后,项目组可以松散但不能撤消,建立经常联络机制,服务响应机制,负责系统维护、技术支持、员工培训等工作,让ERP系统发

    挥出最大作用,也为后续的信息化建设积蓄力量。要建立知识管理体系,把人和脑袋分开管理,实现文档、资料、知识的整理、汇总与共享。这样可以防止有“独门绝活”的员工耍

    横或要挟公司,分散了员工跳槽带来的风险,并有利更多新人的成长。
     
             经历了ERP选型、实施、上线的全过程,我收获的不仅是知识和技能,更重要的是人生经验和体会。今天把这些粗浅的感悟总结出来,希望对我们的实施顾问和客户有所

    帮助。
     

     

  • 白盒测试的覆盖率深度分析

    2008-6-19

    白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、
    工业控制软件等等。白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、
    嵌入式软件的测试、测试的可视化等。

      对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析
    与语法分析、静态错误分析、动态检测等。但是对于不同的开发语言,测试工具实现的方式和
    内容差别是较大的。目前测试工具主要支持的开发语言包括:标准C、C++、Visual C++、
    Java、Visual J++等。

      代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖
    标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆
    盖。

      ·语句覆盖为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆
    盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执
    行一次。语句覆盖是很弱的逻辑覆盖。

      ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的
    含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,
    或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为
    分支覆盖。

      ·条件覆盖在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻
    底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:
    构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。

      ·多条件覆盖多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得
    每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足
    判定覆盖、条件覆盖和条件判定组合覆盖的。

      ·修正条件判定覆盖修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制
    定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这
    个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两
    个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定
    到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、
    or)连接的布尔条件,每个条件对于判定的结果值是独立的。

      不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试
    工具价格是极其昂贵的。
  • codetest 工具

    2007-12-05

    嵌入式软件实时测试工具

    作为全球第一台专为嵌入式系统软件测试而设计的工具套件,CODETEST为追踪嵌入式应用程序,分析软件性能,测试软件的覆盖率以及存储体的动态分配等提供了一个实时在线的高效率解决方案。CODETEST还是一个可共享的网络工具,它将给整个开发和测试团队带来高品质的测试手段。
       CODETEST可同时监视整个应用程序,这就避免了在选择程序的哪部分来观测以及如何配置相应工具来对各部分进行测试时带来的困难。即便是在程序超出高速缓存(cache)或被动态再分配时,CODETEST仍能生成可靠的追踪及测试结果。
       在进入连续运行模式时,CODETEST能够同时测试出软件的性能,代码覆盖以及存储器动态分配,捕获函数的每一次运行,无论是在检测一个局部的软件模块还是整个软件系统测试,工程师只须简单地将CODETEST的仿真探头(probe)插到目标系统的处理器上,预处理待测的源程序,启动CODETEST,运行测试处理软件。测试结果在测试进行过程中或在测试结束后均可随时翻阅。
       CODETEST-ACT(Codetest Advanced Coverage Tools)使得软件测试符合美国FAA,DOD178B,波音飞机等标准。
       基本的CODETEST 系统包括以下四个模块:

    1. 性能分析: 
      CODETEST 能够同时对多达32000个函数进行非采样性测试,精确计算出每个函数或任务(基于RTOS下)的执行时间或间隔,并能够列出其最大和最小的执行时间。对于每两个函数或任务之间的调用也能够计数,从而确认出其中失败的调用。CODETEST的性能分析功能也能够为嵌入式应用程序的优化提供依据,使软件工程师可以有针对性地优化某些关键性地函数或模块,以及改善整个软件地总体性能。
    2. 测试覆盖分析
      CODETEST提供程序总体概况,函数级代码以及源级覆盖趋势等多种模式来观测软件地覆盖情况。由于CODETEST是一种完全地交互式工具,测试者可以在对系统进行操作地同时追踪覆盖情况。
      CODETEST覆盖率信息包括程序实际执行的所有内容,而不是采样的结果,它以不同颜色区分运行和未运行的代码,CODETEST可以跟踪超过一百万个分支点,特别适用于测试大型嵌入式软件。
      CODETEST还能够生成一个融合多种测试结果地综合性报告,以使测试者看到整套测试地总体效果。
    3. 动态存储器分配分析
      在CODETEST诞生之前,动态地存储器分配情况是难以追踪观测的。CODETEST的分析能够显示有多少字节的存储器被分配给了程序的哪一个函数。这样就不难发现那些函数占用了较多的存储空间,那些函数没有释放相应的存储空间。测试者甚至还可以观察到存储体分配情况随着程序运行动态的增加和减少,即CODETEST可以统计出所有的内存的分配情况。随着程序的运行,CODETEST能够指出存储体分配的错误,测试者可以同时看到其对应的源程序内容。
    4. 执行追踪分析(TRACE)
      CODETEST可以按源程序,控制流以及高级模式来追踪嵌入式软件。最大追踪深度可达150万条源级程序,其中高级追踪模式显示的是RTOS的事件和函数的进入退出,给测试者一个程序流程的大框图;控制流追踪增加了可执行函数中每一条分支语句的显示;源级追踪则又增加了对被执行的全部语句的显示。在以上三种模式下,均会显示详细的内存分配情况,包括在那个代码文件的那一行,那一个函数调用了内存的分配或释放函数,被分配的内存的大小和指针,被释放的内存的指针,出现的内存错误。

       CODETEST-ACT(Codetest Advanced Coverage Tools)扩展了CODETEST的简单语句覆盖(SC)为决策覆盖(DC)以及条件决策覆盖(MC/DC)如下:
       SC(Statement Coverage)每一条源代码语句执行过即视为这一条语句 100% 覆盖。
       DC(Decision Coverage)对于每一条条件语句(if/switch/do/while/for)语句的每一个不同的决策值至少出现一次才可被视为100%覆盖。例如每条if语句至少执行两次,至少一次结果为true且至少一次结果为false才可视为完全覆盖。
       MC/DC(Modified Condition/Decision Coverage)对于每一条条件语句的条件,在分解为乘积最小项的加法的真值表中,至少每一个最小项的条件都被满足一次才可视为完全覆盖。
       AMC公司推出全新产品:万用型嵌入式软件在线测试系统(CodeTEST ),支持所有的32/16位CPU和MCU,支持总线频率高达100MHz,可通过PCI/VME/CPCI总线,MICTOR插头对嵌入式系统进行在线测试。无需改动用户的PCB,与用户系统的连接极为方便。

    从事航空软件测试20个月,从codetest获益很多。进行代码覆盖率、动态内存分配的分析。该工具套件非常适合嵌入式软件测试,其测试具有很高的可靠性。

    我们来看一下其工作原理:
      程序员编写的源代码首先会通过CodeTEST 的编译驱动器调用原编译器对进行预编译,然后CodeTEST 的插桩器(源代码分析程序)对预编译好的源代码进行自动的插桩,即在需要插桩的关键位置写入一条赋值语句(如:amc_ctrt=0x74100009),并把插入的标记送入一
    个数据库文件中生成一个符号数据库暂存起来,以备为以后分析时调用。然后,CodeTEST的编译驱动器又会调用原编译器对插桩后的代码进行编译生成可执行目标代码送到目标板上运行。当程序在目标系统运行到插桩点的位置时,目标板的控制总线和地址总线上会出现
    相应的控制信号和地址信号。当CodeTEST 的辅助硬件(信号捕获探头)从控制总线和地址总线上监视到符合以上条件的信号时,CodeTEST 会主动地从数据总线上把数据捕获回来送到CodeTEST 的内存中暂存并对这些数据进行预处理,然后将预处理后的数据通过局域网送
    到工作平台上。通过与前面生成的符号数据库中的数据进行比较,我们就此得知当前程序的运行状态,借此完成对嵌入式软件的性能分析,高级覆盖率分析,内存分析和大容量的代码跟踪。
    具有如下优点:
      CodeTEST 是一个硬件辅助软件的在线测试与分析工具,它一方面吸取软件打点技术,并对这种技术进行了改善,纯软件测试工具插入的是一个函数,而CodeTEST 插入的是一条赋值语句, 它在汇编级也是一条语句,所以它执行的时间非常短,同时避免了被其它的中
    断所中断,它不需要在目标板上存放测试数据,不需要运行额外的预处理任务,所以它对目标系统的影响非常小(1%-15%)。另一方面,CodeTEST 从纯硬件的测试工具那里吸取了从总线捕获数据的技术并且对它进行了改善,CodeTEST 不再是采样的方式,它是通过实时监
    视系统总线,当程序运行到插入的特殊的点的时候才会主动的到数据总线上把数据捕获回来,借此,在同样的处理能力下,CodeTEST 可以做到精确的数据观察。

  • Six sigma

    2007-11-22

    1 sigma 为68%合格率

    2 sigma 为95.44%

    3 sigma 99.73%

    4 sigma 99.9937%

    5 sigma 99.999943%

    6 sigma 99.9999998%

    0.002PPM 10亿分之2

     a lot of famous enterprise use Six Sigma to improve the quality of their product.

    such as Sony,Philips,Ford and so on.

    Six Sigma means 六个标准差,to lowest the defect of enterprise.

    目的:经由设计并监控流程日常操作,将流程操作的可能失误(defect)减少到最低程度,以接近其品质目标标准之品质顶尖水平程度,并减少“不良品质成本”(cost of Poor Quality)、缩短交期(Cycle Time Reduction)、增进顾客满意度。

    最终目的在于经营顾客心,创造全方位顾客满意。

    SixSigma的主要原则:

    1.真诚关心客户

    2.根据资料和事实管理

    3.以流程为重

    4.主动管理

    5.协力合作无界限

    6.追求完美,但同时容忍失败

    6Sigma is one tool, used in all enterprise system widly, including design ,manufacture,sales,service(SVC).

    在企业追求6个标准差的过程中,有很多方法和工具:其中,五个阶段的改进步骤DMAIC:界定define、衡量measure、分析analyze改善improve与控制control。

    6Sigma阶层:

    Champion/Master Black Belt

    Black Blet

    Green Blet

    专业 脱离 需求,就是纸上谈兵

    需求 缺乏了专业就只能Try&Error

  • join

    2007-11-14

    left join是先做inner join再补空的

    left join就是以左表为基准,左表的纪录会全部找出来,而右表只会显示符合条件的记录,记录不足的地方用null填充
    举个例子就很清楚了
    表A记录如下:
    aID     aNum
    1     a20050111
    2     a20050112
    3     a20050113
    4     a20050114
    5     a20050115

    表B记录如下:
    bID     bName
    1     2006032401
    2     2006032402
    3     2006032403
    4     2006032404
    8     2006032408

    sql语句如下:
    select * from A
    left join B
    on A.aID = B.bID
    (left join的左边的表为左表即A,右边的为右表即B)
    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    5     a20050115    NULL     NULL

     

    right join

    sql语句如下:
    select * from A
    right join B
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    NULL    NULL            8     2006032408

  • 进程和线程

    2007-11-14

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
    线程的划分尺度小于进程,使得多线程程序的并发性高。
    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。

  • 精妙Sql语句

    2007-11-14

    SQL分类:
    DDL—数据定义语言(Create,Alter,Drop,DECLARE)
    DML—数据操纵语言(Select,Delete,Update,Insert)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:
    1、说明:创建数据库
    Create DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    A、left outer join:
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (Select a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext
    Wend
     
      这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1
     
    SQL = "Select * FROM Customers Where ID = " & RNumber
     
    set ōbjRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    SQL = "Select * FROM Customers Where ID = " & RNumber & " or ID = " & RNumber2 & " or ID = " & RNumber3
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 Select 语句只显示一种可能(这里的ID 是自动生成的号码):
    SQL = "Select * FROM Customers Where ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试过
    Access语法:Select top 10 * From 表名 orDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:Select iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
      BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
  • transaction isolation level

    2007-11-14

    数据在修改过程中的中间状态对其它事务的可见程度,和其它事务修改数据的中间状态对本事务的可见性。

    控制到 SQL Server 的连接发出的 Transact-SQL 语句的锁定行为和行版本控制行为。

    参数参数
    READ UNCOMMITTED

    指定语句可以读取已由其他事务修改但尚未提交的行。

    在 READ UNCOMMITTED 级别运行的事务,不会发出共享锁来防止其他事务修改当前事务读取的数据。READ UNCOMMITTED 事务也不会被排他锁阻塞,排他锁会禁止当前事务读取其他事务已修改但尚未提交的行。设置此选项之后,可以读取未提交的修改,这种读取称为脏读。在事务结束之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。

    在 SQL Server 2005 中,您还可以使用下列任意一种方法,在保护事务不脏读未提交的数据修改的同时尽量减少锁定争用:

    • READ COMMITTED 隔离级别,并将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON。
    • SNAPSHOT 隔离级别。
    READ COMMITTED

    指定语句不能读取已由其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是 SQL Server 的默认设置。

    READ COMMITTED 的行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置:

    • 如果将 READ_COMMITTED_SNAPSHOT 设置为 OFF(默认设置),则数据库引擎会使用共享锁防止其他事务在当前事务执行读取操作期间修改行。共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行。语句完成后便会释放共享锁。
    • 如果将 READ_COMMITTED_SNAPSHOT 设置为 ON,则数据库引擎会使用行版本控制为每个语句提供一个在事务上一致的数据快照,因为该数据在语句开始时就存在。不使用锁来防止其他事务更新数据。

    当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时,您可以使用 READCOMMITTEDLOCK 表提示为 READ_COMMITTED 隔离级别上运行的事务中的各语句请求共享锁,而不是行版本控制。

    注意:
    设置 READ_COMMITTED_SNAPSHOT 选项时,数据库中仅允许存在执行 ALTER DATABASE 命令的连接。在 ALTER DATABASE 完成之前,数据库中不允许有其他打开的连接。数据库不必处于单用户模式。

    REPEATABLE READ

    指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。

    对事务中的每个语句所读取的全部数据都设置了共享锁,并且该共享锁一直保持到事务完成为止。这样可以防止其他事务修改当前事务读取的任何行。其他事务可以插入与当前事务所发出语句的搜索条件相匹配的新行。如果当前事务随后重试执行该语句,它会检索新行,从而产生幻读。由于共享锁一直保持到事务结束,而不是在每个语句结束时释放,所以并发级别低于默认的 READ COMMITTED 隔离级别。此选项只在必要时使用。

    SNAPSHOT

    指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本。事务只能识别在其开始之前提交的数据修改。在当前事务中执行的语句将看不到在当前事务开始以后由其他事务所做的数据修改。其效果就好像事务中的语句获得了已提交数据的快照,因为该数据在事务开始时就存在。

    除非正在恢复数据库,否则 SNAPSHOT 事务不会在读取数据时请求锁。读取数据的 SNAPSHOT 事务不会阻止其他事务写入数据。写入数据的事务也不会阻止 SNAPSHOT 事务读取数据。

    在数据库恢复的回滚阶段,如果尝试读取由其他正在回滚的事务锁定的数据,则 SNAPSHOT 事务将请求一个锁。在事务完成回滚之前,SNAPSHOT 事务会一直被阻塞。当事务取得授权之后,便会立即释放锁。

    必须将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON,才能开始一个使用 SNAPSHOT 隔离级别的事务。如果使用 SNAPSHOT 隔离级别的事务访问多个数据库中的数据,则必须在每个数据库中将 ALLOW_SNAPSHOT_ISOLATION 都设置为 ON。

    不能将通过其他隔离级别开始的事务设置为 SNAPSHOT 隔离级别,否则将导致事务中止。如果一个事务在 SNAPSHOT 隔离级别开始,则可以将它更改为另一个隔离级别,然后再返回 SNAPSHOT。事务在第一次访问数据时启动。

    在 SNAPSHOT 隔离级别下运行的事务可以查看由该事务所做的更改。例如,如果事务对表执行 UPDATE,然后对同一个表发出 SELECT 语句,则修改后的数据将包含在结果集中。

    SERIALIZABLE

    请指定下列内容:

    • 语句不能读取已由其他事务修改但尚未提交的数据。
    • 任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。
    • 在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。

    范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。在事务完成之前将一直保持范围锁。这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。

    备注备注

    一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。

    事务隔离级别定义了可为读取操作获取的锁类型。针对 READ COMMITTED 或 REPEATABLE READ 获取的共享锁通常为行锁,尽管当读取引用了页或表中大量的行时,行锁可以升级为页锁或表锁。如果某行在被读取之后由事务进行了修改,则该事务会获取一个用于保护该行的排他锁,并且该排他锁在事务完成之前将一直保持。例如,如果 REPEATABLE READ 事务具有用于某行的共享锁,并且该事务随后修改了该行,则共享行锁便会转换为排他行锁。

    在事务进行期间,可以随时将事务从一个隔离级别切换到另一个隔离级别,但有一种情况例外。即在从任一隔离级别更改到 SNAPSHOT 隔离时,不能进行上述操作。否则会导致事务失败并回滚。但是,可以将在 SNAPSHOT 隔离中启动的事务更改为任何其他隔离级别。

    将事务从一个隔离级别更改为另一个隔离级别之后,便会根据新级别的规则对更改后读取的资源执行保护。在更改前读取的资源将继续按照以前级别的规则受到保护。例如,如果某个事务从 READ COMMITTED 更改为 SERIALIZABLE,则在该事务结束前,更改后所获取的共享锁将一直处于保留状态。

    如果在存储过程或触发器中发出 SET TRANSACTION ISOLATION LEVEL,则当对象返回控制时,隔离级别会重设为在调用对象时有效的级别。例如,如果在批处理中设置 REPEATABLE READ,并且该批处理调用一个将隔离级别设置为 SERIALIZABLE 的存储过程,则当该存储过程将控制返回给该批处理时,隔离级别就会恢复为 REPEATABLE READ。

  • 数据库、DBMS和SQL

    2007-11-14

    数据库是数据的集合,它由一个或多个表组成。每一个表中都存储了对一类对象的数据描述,一个典型的表如表10.1所示。表的每一列描述了对象的一个属性,如姓名、出生年月等,而表的每一行则是对一个对象的具体描述。一般将表中的一行称作记录(record)或行(row)

    将表的每一列称作字段(field)或列(column)

    数据库通常还包括一些附加结构用来维护数据。

    10.1

    学 号

    姓 名

    出生年月

    性别

    1

    李明

    06/12/77

    2

    张芳

    11/24/78

     

    若一个数据库只有一个表,则称之为简单数据库。若数据库由多个相关的表组成,则称其为关系数据库。关系数据库利用公共关键字段将它的表联系起来,例如在表10.1中,可以将学号作为一个关键字段,如果数据库中还有一个学生成绩表并且也有学号字段,则可以通过学号这个关键字段将两个表联系起来。

    DBMS(数据库管理系统)是一套程序,用来定义、管理和处理数据库与应用程序之间的联系,例如FoxProAccessSybase等都是DBMS。图10.1说明了用户、DBMS和数据库三者的关系。

    T10_1.tif (104260 bytes)

    10.1 用户、DBMS、数据库三者的关系

    SQL(Structured Query Language结构化查询语言) 最早由IBM提出,是专门用来处理关系数据库的基于文本的语言。SQL向数据库提供了完善而一致的接口,它不是独立的计算机语言,需要DBMS的支持方能执行。SQL是一种标准的数据库语言,目前大多数DBMS都支持它。

Open Toolbar