海是我向往的地方,吸纳和咆哮是他的魅力!!!

发布新日志

  • LoadRunner添加Weblogic监控的注意事项(非单纯的操作步骤)

    zibeike 发布于 2008-08-21 20:31:53


      关于LR如何监控Weblogic(JMX方式)的操作就不在这里多说了,帮助文件和网上的介绍已经非常多了,关键是对各操作步骤是否理解正确以及添加过程中各种错误的原因及解决.
      1. LR的Controller机器上需要安装跟Weblogic版本一致的java虚拟机,如果安装的版本不一致,就会出现 类似 版本不匹配,某些类找不到的错误.
      2. 修改weblogicmon.ini的注意事项:
          [WebLogicMon] 下面的JVM和JavaVersion的设置,即为LR的Controller机器上安装的JVM的路径和版本,这个跟1是一致.
      3.LR8.0和8.1在添加对WebLogic9.0及以上版本的监控时,出现的计数器界面是空的,即获取不到Weblogic的性能数据,对这个问题我的推断是这样的:
        LR通过JMX方式获取Weblogic的各性能数据,而Weblogic9.0及以上版本的JMX使用的JMX1.2
        Weblogic8.1版本使用的JMX1.0,因为JMX1.2规范各API的比JMX1.0变化了很多,因此这两个不同 版本的JMX肯定是要用不同的代码去实现的,推断LR中没有支持JMX1.2的代码,因此也就无法通过JMX的方式来获取使用了JMX1.2规范的Weblogic的性能计数器的数据了.至于LR的最新版本是否支持Weblogic9.0及其以上版本,这个还没有做验证.

    本文出自zibeike的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?34866
  • LoadRunner Citrix协议知识总结三

    zibeike 发布于 2008-12-29 15:49:03

       zibeike接着总结二,继续Citrix脚本的场景执行方面的总结.

    : Citrix协议脚本的场景执行

    1. 调整Citrix服务器参数

    默认的MetaFrame服务器设置如下:

     

    在进行Citrix场景的时候, 需要调整上面标红色的参数, 调整为 reset , 并且把 上面

    “inhert user config” 选项的钩 去掉.

    设置为reset, 并且不继承用户配置, 这样场景中即使有用户失败的情况, session也会重置.

    2. 调整场景参数便于调试

       正常情况下,在运行场景时,Citrix客户端的界面就不会显示出来,有时候为了调试方便,可以在Controller中添加下面的参数使Citrix客户端的界面显示出来。

    Controller Design页面 Details

    Command line中输入:lr_citrix_vuser_view

    如下图所示:

     

    注意:如果用户数非常多的时候想使用该命令时,为了减少客户端资源的占用,尽量选取用户数少的组来添加该命令来显示Citrix客户端的界面。

    3. 分配足够的Citrix用户

       在场景运行时,需要申请足够多的Citrix帐号, 使每个虚拟用户使用不同的Citrix帐号

    4. 运行时设置的超时时间

    如果需要请修改超时时间的设置.

    1) 默认的连接超时时间为180.

    2) 默认的同步窗口的超时时间为60

       以上是zibeikeLoadRunner Citrix协议的总结 , 因为没有用到LoadRunner Citrix Agent, 因此本文未涉及LoadRunner Citrix 协议的Citrix Agent部分的内容, 文章内容有不对指处, 还请大家指正. 谢谢!

     

     

     

  • 如何更改监控器的默认计数器

    zibeike 发布于 2009-01-04 17:03:08

      通过编辑 LoadRunner\dat 目录中的 res_mon.dft 文件,可以更改系统资源、
    Microsoft IIS、Microsoft ASP 或 SQL Server 监控器的默认计数器。
    要更改默认计数器,请执行下列操作:
    1 打开一个新的场景或会话并单击“运行”选项卡(在 Controller 中)或“会
    话”选项卡(在优化控制台中)。
    2 对于每个监控器,请选择要度量的计数器。
    3 保存该场景或会话,然后使用编辑器打开场景或会话的 .lrs 文件。
    4 将选定的每个计数器的 MonItemPlus 部分复制到 res_mon.dft 文件中。
    5 统计该文件中的新计数器的数量,然后使用该数字更新 ListCount 参数。
  • LoadRunner如何调用外部函数

    zibeike 发布于 2009-01-04 17:08:22

       使用 VuGen 时,可以调用在外部 DLL 中定义的函数。通过从脚本调用外部函
    数,可以降低脚本的内存使用量以及总体运行时间。
    要调用外部函数,需要加载定义了该函数的 DLL。
    可以用下列方法加载 DLL:
      本地 — 用于一个脚本,使用 lr_load_dll 函数。
      全局 — 用于所有脚本,方法是向 vugen.dat 文件中添加语句

    加载 DLL — 本地
      使用 lr_load_dll 函数可以在 Vuser 脚本中加载 DLL。DLL 加载成功之后,可以
    调用 DLL 中定义的任何函数,而无需在脚本中对其进行声明。
    要调用 DLL 中定义的函数,请执行下列操作:
    1 使用 lr_load_dll 函数在脚本的开头加载 DLL。将语句放在 vuser_init 部分的开
    头。lr_load_dll 将替换 ci_load_dll 函数。
    请使用以下语法:
    lr_load_dll(library_name);
    注意,在 UNIX 平台中, DLL 被称为共享库。该库的扩展名取决于平台。
    2 在脚本的适当位置调用 DLL 中定义的函数。
    在下例中,创建表 Test_1 之后,调用了在 orac1.dll 中定义的 insert_vals 函数。

    int LR_FUNC Actions(LR_PARAM p)
    {
    lr_load_dll("orac1.dll");
    lrd_stmt(Csr1, "create table Test_1 (name char(15), id integer)\n", -1,
    1 /*Deferred*/, 1 /*Dflt Ora Ver*/, 0);
    lrd_exec(Csr1, 0, 0, 0, 0, 0);
    /* Call the insert_vals function to insert values into the table.*/
    insert_vals();
    lrd_stmt(Csr1, "select * from Test_1\n", -1, 1 /*Deferred*/, 1 /*Dflt Ora Ver*/,
    0);
    lrd_bind_col(Csr1, 1, &NAME_D11, 0, 0);
    lrd_bind_col(Csr1, 2, &ID_D12, 0, 0);
    lrd_exec(Csr1, 0, 0, 0, 0, 0);
    lrd_fetch(Csr1, -4, 15, 0, PrintRow14, 0);

    注意: 您可以为 DLL 指定完整路径。如果不指定路径, lr_load_library 将使用
    Windows 平台上的 C++ 函数 LoadLibrary 所使用的标准序列来搜索 DLL。在
    UNIX 平台上,可以设置 LD_LIBRARY_PATH 环境变量(或平台上与其等效的
    变量)。lr_load_dll 函数使用与 dlopen 相同的搜索规则。有关详细信息,请参
    阅 dlopen 或与其等效的主页。

    加载 DLL — 全局
    可以全局加载 DLL,使其函数能够用于所有 Vuser 脚本。DLL 加载成功之后,
    可以调用 DLL 中定义的任何函数,而无需在脚本中对其进行声明。
    要调用 DLL 中定义的函数,请执行下列操作:
    1 向 mdrv.dat 文件(位于应用程序的 dat 目录)的相应部分中添加要加载的 DLL
    列表。
    请使用以下语法:
    PLATFORM_DLLS=my_dll1.dll, my_dll2.dll, …
    用您的特定平台替换单词 PLATFORM。有关平台的列表,请参阅 mdrv.dat 文件
    的开始部分

    例如,要在 NT 平台上为 Winsocket Vuser 加载 DLL,请向 mdrv.dat 文件中添
    加下列语句:

    [WinSock]
    ExtPriorityType=protocol
    WINNT_EXT_LIBS=wsrun32.dll
    WIN95_EXT_LIBS=wsrun32.dll
    LINUX_EXT_LIBS=liblrs.so
    SOLARIS_EXT_LIBS=liblrs.so
    HPUX_EXT_LIBS=liblrs.sl
    AIX_EXT_LIBS=liblrs.so
    LibCfgFunc=winsock_exten_conf
    UtilityExt=lrun_api
    ExtMessageQueue=0
    ExtCmdLineOverwrite=-WinInet No
    ExtCmdLineConc=-UsingWinInet No
    WINNT_DLLS=user_dll1.dll, user_dll2.dll, …
    2 在脚本的适当位置调用 DLL 中定义的函数。

  • 介绍LoadRunner和QTP的英文Blog

    zibeike 发布于 2009-01-06 11:44:51

       记录一下:http://motevich.blogspot.com/ ,有时间翻译一些文章。
  • LoadRunner穿过防火墙运行Vuser和进行监控

    zibeike 发布于 2009-01-16 17:18:39

       LoadRunner穿过防火墙进行测试,总结下来是2个方法:
    1. 在controller和Vuser 的LAN中的防火墙都打开54345端口即可。

    2. 另外就是使用MI Listener,Controller的机器上使用MI Listener或者是和Controller在同一个内网上的机器上安装和配置MI Listener ,防火墙打开TCP/IP 或者HTTPS 的443端口。防火墙另一端的压力负载机上需要启用防火墙代理, 这样互相之间应该就可以通信了,另外如果需要通过防火墙监控资源的话,还需要在防火墙内的计算机上安装穿越防火墙进行监控的组件(包括loadrunner agent process)。具体请参考附件文档的8个步骤。
  • 面试经验的BBS

    zibeike 发布于 2007-05-31 11:08:33

       发现一个IT电信方面面试的BBS:http://www.xyzhan.com/bbs/forumdisplay.php?fid=45&page=1

  • TD的安装经验

    zibeike 发布于 2007-05-31 11:01:59

       前几天一直在我的XP机器上安装TD8.0SP2,安装完之后,总是出现RPC错误,从网上搜索了一翻,发现可能的错误是:RPC服务没有启动等,可还是没有解决问题.反复卸载安装,就是不成功。越不成功越想用,好不容易找到这个个好东东,因为一直想找个测试用例管理的工具,找了些都不太理想,TD应该是比较好的,就不信装不上了。昨天,在51testing上发现一篇介绍TD安装的文章,其中讲到,管理员帐号密码为空的时候,会出现RPC错误。哈哈,我的正好是这种情况,赶紧修改了密码,再次安装,成功了。兴奋呀,哈哈。然后新建项目的时候,连SQLSERVER总是出错,不知道哪位高人能否给予指点。因为着急用,就没有解决这个问题,先用ACCESS好了。

  • 测试好书和网站

    zibeike 发布于 2007-05-31 10:47:19

        因为看了一个测试群里发的<软件测试的经验与教训>,感觉写的非常好,好多理论的东西是在我原来脑子里没有的东西,很想找这个英文原著来好好学习一下,在GOOGLE上搜索了一翻,还没有找到有效的下载地址,却发现了不少的测试好书和网站.这里,我把它们列出来,开始学习,以后要在这个BLOG中写自己的学习体会了,哈哈.下面是发现的好的网址,先记下来:

      测试书籍的推荐:

      http://www.cntesting.com/hphtml/?thread-7346.html

      软件测试好书下载和推荐:

      http://www.51testing.com/recommend.htm

      英文测试网站:

      http://www.softwareqatest.com/

      http://www.testingcraft.com/

      http://www.qacity.com/

     

  • 软件测试相关电子书下载

    zibeike 发布于 2007-09-02 18:27:25

       1年多保存下载的测试资料因为硬盘损坏而丢了,竟然用FINALDATA也没有找到,真是心疼了。今天网上无意间发现一个软件测试电子书下载的地方,开始疯狂下载,网址是:

    http://www.itpub.net/325522,1.html

  • 笔试的感受

    lxbfanny 发布于 2007-10-30 14:18:23

       上周一去了一个叫神州数码的公司笔试,先来一个小时的智力题,跟专业一点关系都没有.然后再来一个半小时的SQL题和测试知识题.考的头都大了.

       然后礼拜三接到电话礼拜四去面试了,他们主管说我原来是做实施的,所以后来就没戏了……

       总结了这次经验,还得继续朝测试方面发展啊!

  • Mysql的一些基本操作。

    zhengwq 发布于 2009-05-14 10:34:51

    从命令行调用mysql程序:
    [开始]--[运行]--cmd命令
    获得用户账户列表
    shell->mysql -u root -p -e "SELECT User, Host FROM User" mysql         
    Enter password: ******  

    登录数据库:
    shell->mysql -u root -p
    Enter password: ******
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 12 to server version: 5.0.22-community-nt
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql>
    或者:
    shell->mysql -u root -p******
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 12 to server version: 5.0.22-community-nt
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql>

    注:-p******和-p ******的区别
    -p******表示使用******为密码
    -p *******表示指定使用那个数据库(*******为数据库的名称)

    从外核执行查询: (注意 -e 和 --execute= 的区别)  
    shell->mysql -u root -p --execute="SELECT id from pole3_production.channel_items"
    Enter password: ******

    shell->mysql -u root -p -e "SELECT id from pole3_production.channel_items"
    Enter password: ******
    该条命另执行完,仍然回到外核
    注:--execute后面必须紧跟一个等号(=)

    显示当前的数据库列表:
    mysql>show databases;
    使用末各数据库:
    mysql>use databases
    Database changed
    显示当前选择了的数据库
    mysql>select database();
    创建数据库:
    mysql>create database database_name;
    创建表:
    mysql>create table table_name (*** varchar(),**** varchar(),...);
    查看当前表的创建信息
    mysql> DESCRIBE table_name;
    给表插入一条数据
    mysql> INSERT INTO table_name
        -> VALUES ('***','***','****','****',....);
    显示当前数据库的所有表:
    mysql>show tables;
    导入数据库:(source命令)
    mysql>use 数据库(先确定使用哪一个数据库来导入数据)
    mysql>source d:\wcnc_db.sql  (d:\wcnc_db.sql为数据库在本地的存放路径)

    帮助:
    mysql>help ******
    mysql>\h *****
    清除:
    mysql>\c
    退出
    mysql>quit
    bye

    查询:
    1.用分号隔开多条查询语句:
    mysql>select version(); select now();
    2.将mysql用作一个简单的计算器:
    mysql>SELECT 7/4, (4+1)*5;
    3.查询所有数据
    mysql>SELECT * FROM table_name;
    4.查询特殊行
    mysql> SELECT * FROM table WHERE para='****';
    组合条件查询(and 和 or,AND和OR可以混用,但AND比OR具有更高的优先级。)
    5.查询特殊列:
    mysql> SELECT id, para FROM table_name;
    5.1.查询特殊列的同时筛选不一样的打印:
    mysql> SELECT Distinct id FROM table_name;
    6.查询结果分类排序
    mysql>SELECT id, **** FROM pet ORDER BY ****;
    mysql>SELECT id, **** FROM pet ORDER BY **** desc;(倒序排列)
    [教程中特殊的例子]
    mysql> SELECT name, species, birth FROM pet

        -> ORDER BY species, birth DESC;

    +----------+---------+------------+

    | name     | species | birth      |

    +----------+---------+------------+

    | Chirpy   | bird    | 1998-09-11 |

    | Whistler | bird    | 1997-12-09 |

    | Claws    | cat     | 1994-03-17 |

    | Fluffy   | cat     | 1993-02-04 |

    | Fang     | dog     | 1990-08-27 |

    | Bowser   | dog     | 1989-08-31 |

    | Buffy    | dog     | 1989-05-13 |

    | Puffball | hamster | 1999-03-30 |

    | Slim     | snake   | 1996-04-29 |

    +----------+---------+------------+
    7.查询并赋值
    mysql>select year(now())- '2000' as age;
    +------+
    | age  |
    +------+
    |    9 |
    +------+
    1 row in set (0.02 sec)
    8.匹配:
    8.1.字段以*开头的
    mysql>select *****,**** from table_name where *** like '*%';
    8.2.字段以*结尾的
    mysql>select *****,**** from table_name where *** like '%*';
    8.3.字段中包含*的
    mysql>select *****,**** from table_name where *** like '%*%';
    8.4.字段中包含n个字母的(一个'_'表示一个字符)
    mysql>select title,user_id from channel_items where title like '___';
    9.计数行
    mysql>select count(*) from channel_items where title='home';
    9.1.分组计数行 排序(COUNT( )和GROUP BY以各种方式分类你的数据)
    mysql>select user_id, count(*) from channel_items group by user_id order by count(*) ;

  • 嵌入式Linux操作系统学习规划(转)

    捕虫者 发布于 2009-01-29 01:39:52

    嵌入式Linux操作系统学习规划
    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: 
    (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) 
    (2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定) 
    (3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。 
    从事嵌入式软件开发的好处是: 
    (1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。 
    (2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。 
    (3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。 
    (4)兴趣所在,这是最主要的。 
    从事嵌入式软件开发的缺点是: 
    (1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。 
    (2)这方面的企业数量要远少于企业计算类企业。 
    (3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。 
    (4)平台依托强,换平台比较辛苦。 
    兴趣的由来: 
    1、成功观念不同,不虚度此生,就是我的成功。 
    2、喜欢思考,挑战逻辑思维。 
    3、喜欢C 
    C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下: 
    相信程序员。 
    不要阻止程序员做那些需要去做的。 
    保持语言短小精干。 
    一种方法做一个操作。 
    使得它运行的够快,尽管它并不能保证将是可移植的。 
    4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。 
    5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。 
    方法步骤: 
    1、基础知识: 
    目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。 
    科目:数字电路、计算机组成原理、嵌入式微处理器结构。 
    汇编语言、C/C++、编译原理、离散数学。 
    数据结构和算法、操作系统、软件工程、网络、数据库。 
    方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。 
    主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。 

    2、学习linux: 
    目的:深入掌握linux系统。 
       方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。 
    主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。 
    3、学习嵌入式linux: 
    目的:掌握嵌入式处理器其及系统。 
    方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。 
       (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。 
       (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。 
       主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。 

    4、深入学习: 
       A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。 
       B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。 
       C、网络与信息安全技术:如加密技术,数字证书CA等。 
       D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。 
       说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。 
       注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。 
       不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的! 
       技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。 

       嵌入式书籍推荐 
       Linux基础 
       1、《Linux与Unix Shell 编程指南》 
       C语言基础 
       1、《C Primer Plus,5th Edition》【美】Stephen Prata着 
       2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着 
       3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE) 
       4、《嵌入式Linux应用程序开发详解》 
       Linux内核 
       1、《深入理解Linux内核》(第三版) 
       2、《Linux内核源代码情景分析》毛德操 胡希明著 
       研发方向 
       1、《UNIX Network Programming》(UNP) 
       2、《TCP/IP详解》 
       3、《Linux内核编程》 
       4、《Linux设备驱动开发》(LDD)  
       5、《Linux高级程序设计》 杨宗德著
       硬件基础 
       1、《ARM体系结构与编程》杜春雷着 
       2、S3C2410 Datasheet 
       英语基础 
       1、《计算机与通信专业英语》 
       系统教程 
       1、《嵌入式系统――体系结构、编程与设计》 
       2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着 
       3、《Building Embedded Linux Systems》   
       4、《嵌入式ARM系统原理与实例开发》 杨宗德著
       理论基础 
       1、《算法导论》 
       2、《数据结构(C语言版)》 
       3、《计算机组织与体系结构?性能分析》 
       4、《深入理解计算机系统》【美】Randal E. Bryant David O''Hallaron着 
       5、《操作系统:精髓与设计原理》 
       6、《编译原理》 
       7、《数据通信与计算机网络》 
       8、《数据压缩原理与应用》 

       C语言书籍推荐 
       1. The C programming language 《C程序设计语言》 
       2. Pointers on C 《C和指针》 
       3. C traps and pitfalls 《C陷阱与缺陷》 
       4. Expert C Lanuage 《专家C编程》 
       5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs 
       《编程精粹--Microsoft 编写优质无错C程序秘诀》 
       6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》 
       7.《C语言嵌入式系统编程修炼》 
       8.《高质量C++/C编程指南》林锐 
       尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。 

  • 超级详细的Tcpdump用法(转载)

    捕虫者 发布于 2009-03-29 21:04:18

    来源: ChinaUnix博客  日期: 2007.09.05 14:07 (共有0条评论) 我要评论
     

    今天在CU上看到一篇关于Tcpdump的好文,原文作者jeffyan,转载留档,并与大家共享
    第一种是关于类型的关键字,主要包括host,net,port, 例如
    host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
    202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.
    第二种是确定传输方向
    的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src
    210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0
    指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
    第三种是协议的关键字,主要包
    括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是
    "ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字
    就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
       
    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是
    'not ' '! ', 与运算是'and','&&';或运算 是'or'
    ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
        普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
    # tcpdump
    tcpdump: listening on fxp0
    11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
    11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
                             0000 0000 0080 0000 1007 cf08 0900 0000
                             0e80 0000 902b 4695 0980 8701 0014 0002
                             000f 0000 902b 4695 0008 00
    11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
                             ffff 0060 0004 ffff ffff ffff ffff ffff
                             0452 ffff ffff 0000 e85b 6d85 4008 0002
                             0640 4d41 5354 4552 5f57 4542 0000 0000
                             0000 00
    使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
    使用-c参数指定要监听的数据包数量,
    使用-w参数指定将监听到的数据包写入文件中保存
       A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1
    B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
    C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
    D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1
    E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
    # tcpdump udp port 123
      
    F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
    #tcpdump -i eth0 src host hostname
    G 下面的命令可以监视所有送到主机hostname的数据包:
    #tcpdump -i eth0 dst host hostname
    H  我们还可以监视通过指定网关的数据包:
    #tcpdump -i eth0 gateway Gatewayname
    I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
    #tcpdump -i eth0 host hostname and port 80
    J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
    ,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
    K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
    :(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
    L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
       #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
    M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
       #tcpdump tcp port 23 host 210.27.48.1
    第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
    r' ,'||';
    第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
    如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
    #tcpdump –i eth0 host hostname and dst port 80  目的端口是80
    或者
    #tcpdump –i eth0 host hostname and src port 80  源端口是80  一般是提供http的服务的主机
    如果条件很多的话  要在条件之前加and 或 or 或 not
    #tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
    如果在ethernet 使用混杂模式 系统的日志将会记录
    May  7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
    May  7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
    May  7 20:03:57 localhost kernel: device eth0 left promiscuous mode
    tcpdump
    对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参
    数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13177/showart_374724.html
  • Tcpdump用法详解(转)

    捕虫者 发布于 2009-03-29 21:07:46

    tcpdump采用命令行方式,它的命令格式为:
      tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
              [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
              [ -T 类型 ] [ -w 文件名 ] [表达式 ]

      1. tcpdump的选项介绍
       -a    将网络地址和广播地址转变成名字;
       -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
       -dd    将匹配信息包的代码以c语言程序段的格式给出;
       -ddd    将匹配信息包的代码以十进制的形式给出;
       -e    在输出行打印出数据链路层的头部信息;
       -f    将外部的Internet地址以数字的形式打印出来;
       -l    使标准输出变为缓冲行形式;
       -n    不把网络地址转换成名字;
       -t    在输出的每一行不打印时间戳;
       -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
       -vv    输出详细的报文信息;
       -c    在收到指定的包的数目后,tcpdump就会停止;
       -F    从指定的文件中读取表达式,忽略其它的表达式;
       -i    指定监听的网络接口;
       -r    从指定的文件中读取包(这些包一般通过-w选项产生);
       -w    直接将包写入文件中,并不分析和打印出来;
       -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程
    调用)和snmp(简单       网络管理协议;)

      2. tcpdump的表达式介绍
       表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表
    达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
    被截获。
       在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,
    net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
    202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是
    host.
       第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
    这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
    48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
    缺省是src or dst关键字。
       第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
    FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e
    ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
    其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
    监听所有协议的信息包。
       除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
    r' ,'||';
       这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
    说明。
       (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
        #tcpdump host 210.27.48.1
       (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
    :(在命令行中适用   括号时,一定要
        #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
       (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
    ,使用命令:
        #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
       (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
        #tcpdump tcp port 23 host 210.27.48.1
     3. tcpdump 的输出结果介绍
       下面我们介绍几种典型的tcpdump命令的输出信息
       (1) 数据链路层头信息
       使用命令#tcpdump --e host ice
       ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
       H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条
    命令的输出结果如下所示:
    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.
    telne
    t 0:0(0) ack 22535 win 8760 (DF)
      分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该
    数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它
    表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的
    目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.
    telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535
    表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

      (2) ARP包的TCPDUMP输出信息
       使用命令#tcpdump arp
       得到的输出结果是:
      22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
      22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af
    :1a)
      分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是
    ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5
    8:af:1a是主机ICE的MAC地址。

      (3) TCP包的输出信息
       用TCPDUMP捕获的TCP包的一般输出信息是:
      src > dst: flags data-seqno ack window urgent options
      src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F
    IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
    下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
    Options是选项.

      (4) UDP包的输出信息
       用TCPDUMP捕获的UDP包的一般输出信息是:
      route.port1 > ice.port2: udp lenth
      UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
    ICE的port2端口,类型是UDP, 包的长度是lenth

    本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/cmd/20090303/15902_2.html

  • 51软件测试面试总结

    七明芝 发布于 2009-03-28 02:00:31

    让我紧张万分的模拟面试终于结束了~稍稍的总结下。。。

    当听到我是那位传说中的“温柔的杀手”面试的时候,我心里狠狠的“格登”了一下。推门进去后云层奸诈的小笑了三声“你死定了。”“我早有心理准备了。”看到熟悉的面孔我突然又不紧张了。

    第一关:英文自我介绍。不多说了。(以下提问并非原话,意思差不多这样)

    问:你为什么会有两个学位?这不是一般研究生才有的?

    答:(疑惑,怎么先问了这个?)我们的学院是中外合作办学。。。

    问:你为什么会去考项目管理专业认证?

    答:(汗啊,这个是我随手写上的,没想到面试官有兴趣啊。愣了1秒。)

    问:说说什么是项目管理吧。

    答:(还记得项目的几个重要因素,按自己的理解扯了几句。)

    问:为什么要做测试?

    答:(总算进入正题了,虽然这个问题我没准备过,但是来51学习之前我就确实考虑过这个问题。于是很从容的从我大学的一个项目谈起,其间插问了项目的具体内容和JGRASP。)

    问:在51学到了什么?

    答:(把51课程的提纲搬上去。)

    以下基本上根据我简历里写的职业技能提问

    问:在做项目时是怎么使用QC的?

    答:(从需求、测试项、用例、执行到缺陷开始扯)

    问:需求变更时,QC能做什么?

    答:(QC原本有这项功能么?貌似没有,那自己添加属性吧。从添加属性开始扯。)

    问:什么是配置管理?

    答:(再汗一个。。。 没有实践过,理论也背不下来,憋了两秒钟,坦白承认我忘了。。。)

    问:SVN在测试中的应用。

    答:(只说出了一个回溯的作用)

    接下来问了些LINUX基本命令,发现很多已经记不清了,只能回答出一半。

    问:OracleSQL server2000MySQL数据库的默认用户名是什么?

    答:Oracle我没安装过。SQL server2000saMySQL不知道。(坦白从宽。。。)

    问:如何查询两张表的内容?

    答:(说了下我怎么用连接的方法查询两张表的内容的,当时没反应过来有连接和嵌套两种方法,只能举了例子说)

    问:什么是内连接和外连接?

    答:(没背过概念,按自己的理解扯。)

    问:C和java的区别。

    答:(因为曾经用过java写程序,从java的封装特性开始对比。说的完全是自己的感觉,毫无章法,丢脸一个。。。)

    接下来根据我写的项目问我怎么设计用例,自我感觉回答的没有想象中的好,有点乱。唉,这部分准备了最多,结果只问了这么个问题。

    问:你还有什么问题吗?

    答:(折磨总算结束了)

    评价:学的是英文版的专业书,英文没有问题,有项目管理知识,专业方面答的还可以,如果面试时有这样的发挥就过了。惊讶!惊讶!惊讶!就这么过了?我还正郁闷刚刚那么多题没答出来啊。传说中把N个学员拍死了的人物居然让我过了?还是,这年头“杀手”也改行啦?难于置信~

    云层说我所有的回答都没有上纲上线的,给他的感觉是动手能力不错,女孩子有给人这样的感觉很好。额,老大,那是因为你问的都是我简历上写着“了解”的内容,事先毫无准备呀。(N个经验者告诉我,写“熟悉”的内容一定要多多准备,碰到个神人,不按牌理出牌的。)而我,看过的背过的东西总是当时记得清楚可是又很快就忘了——应试教育的产物,只有做过的才比较记得,只好扯那些做过的东西了。居然给了个动手能力强的评价,哎,这可跟我对自己的一贯认识差好远啊。

    说我回答的最好的部分是关于为什么要做测试,思路很清晰。哈哈,这要华华丽的感慨下,貌似我的想法总是比周围的同龄人快一拍啊。在我来51之前我已经对自己职业之路的思考了又思考了。

    面试完了,感慨下,云层的评价给了我些许自信,也许黎明前的曙光就要来了。不过,面试真的还挺多运气成分。好多经典的问题,他没问的,我不一定能答好。还有许多的技术知识一窍不通,面试的时候也体现出来了,有些技术问题压根一点也不知道,到现在甚至已经忘了是什么问题了,没法记录下来。只是,云层被我华丽丽的职业之路的思考给镇住,嘿嘿。。

    革命尚未成功,同志仍需努力。

    引用某人的一句话,在拿到offer之前,一切都是未知数。加油,加油!!!

  • 新手必看《自动化测试工具介绍QTP篇》

    七明芝 发布于 2009-04-13 21:58:17

    Mercury QuickTest Professional™是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。

    Mercury QuickTest Professional为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。

    QuickTest Professional是新一代自动化测试解决方案,采用了关键词驱动(Keyword-Driven)测试的理念,能完全简化测试的创建和维护工作。QuickTest关键词驱动方式独有之处在于,测试自动化专家可以通过一个整合的脚本和纠错环境,拥有对基础测试脚本和对象属性的完全访问权限,这些脚本和纠错环境与关键词视图(Keyword View)可以互为同步。

    QuickTest Professional同时满足了技术型和非技术型用户的需求,让各个公司有能力部署更高质量的应用,同时部署的速度更快,费用更低,风险也更小。QuickTest Professional和我们新的测试自动化系统Mercury Business Process Testing™的紧密结合,可以将非技术型的业务专家(SME, Subject-Matter Experts)引入质量流程,这一意义重大的引入可以将IT和业务更好地融合,最终建立起更出色的应用。

    有了该产品,您的QA机构可以获取多方面的优势:

    用最少的培训赋予整个小组创建成熟测试方案的能力。

    确保跨所有环境、数据包和业务流程的正确功能点。

    为开发人员全面记录和复制缺陷,使他们能更快地修复缺陷,满足最后上线期限。

    对不断变化的应用和环境展开便捷的回归测试。

    成为帮助整个机构实现高质量产品和服务、提高总收入和收益率的关键角色。

    QuickTest Professional是如何工作的

    QuickTest Professional易于操作,即使是初级的测试人员也能在短时间内对其驾轻就熟。您可以使用无需脚本的关键词视图来表现测试的每个步骤,仅由此就可创建一个测试。您还可以通过QuickTest Professional所集成的录制能力来捕获测试步骤。该产品用简单的英语以文档形式记录每个步骤,并通过活动屏幕将文档与一个集成截屏相结合。传统的脚本记录工具所生产的脚本不易修改,与此不同的是,QuickTest Professional的关键词驱动方式能让您便捷地插入、修改、数据驱动(data-drive)和移除测试步骤。

    QuickTest Professional可以自动引入检查点来验证应用的属性和功能点,比如确认输出量或检查链接的有效性。在关键词视图的每一步骤中,活动屏幕可显示被测应用在该步骤中的确切状态。您还可以为任意对象加入几种检查点,仅仅在活动屏幕中点击该对象,就可以验证该组件行为是否达到了期望值。

    然后您可以将测试数据输入数据表(Data Table),它拥有和Excel同样完善的功能特性,是一个集成的电子数据表格。您可以使用数据集并创建多种重复测试,无需编程就可以扩展测试案例的覆盖面。数据可以通过键入的方式输入或从数据库、数据表格或文本文档中导出。

    高级测试人员可以在专家视图(Expert View)中查看和修改他们的测试,在专家视图中显示了由QuickTest Professional自动生成的基于行业标准的基本VBscrīpt语言。在专家视图中所做的任何改动将自动与关键词视图同步。

    一旦测试人员运行了一个脚本,TestFusion报告将显示测试运行各方面的信息,包括:高水平的结果纵览;一个可扩展的测试脚本树状视图(Tree View),其明确指出了应用错误的发生位置;被使用的测试数据;每个步骤的应用截屏,其中并标明了所有的差异;以及通过或未通过每个检查点的详细解释。您可以将TestFusion报告和QuickTest Professional结合,从而与整个QA和开发小组分享这些报告。

    QuickTest Professional处理一些应用的新版本问题。当一个被测应用发生变化时,比如把一个”Login”按钮被改名为”Sign in”,您可以在共享对象容器(Shared Object Repository)中做一次更新,接着此次更新将扩展到所有涉及这个对象的脚本。您可以将测试脚本公布给Mercury Quality Management,使其它的QA小组成员也可以使用您的测试脚本,从而减少了重复工作。

    通过与Business Process Testing的整合,在一个基于Web的系统中,QuickTest Professional被用于实现自动化操作,使非技术型用户可以便捷地在一个完全的无脚本环境中也能够建立起测试。

    QuickTest Professional支持多种企业环境的功能测试,包括Windows、Web、.NET、 Java/J2EE、SAP、Siebel、Oracle、PeopleSoft、Visual Basic、ActiveX、Mainframe. terminal emulators和Web services。

    Mercury功能测试

    那些在Mercury WinRunner®测试工具上投入大量资金,并想转入Mercury QuickTest Professional™的用户,可以使用Mercury Functional Testing™来实现这种转变。Mercury Functional Testing将QuickTest Professional和WinRunner结合成一种集成产品,它不仅可以使用WinRunner脚本,也可以使用QuickTest Professional脚本,使测试资源得到极大地利用。质量工程师可以使用Mercury Functional Testing来创建“复合脚本”测试,这些脚本是在WinRunner和QuickTest Professional中建立的。Mercury Functional Testing是WinRunner和QuickTest Professional的集成,产品间可以相互调用脚本,测试结果可以在一个共有的报告界面上呈现。

    Mercury质量中心的组成部分之一

    Mercury QuickTest Professional是Mercury质量中心(Mercury Quality Center™)的组成部分之一,Mercury质量中心集成了一整套软件、服务和最佳实践,用于自动化关键质量活动,包括需求管理、测试管理、缺陷管理、功能测试和业务流程测试。

    特点和优势:

    具有行业领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。

    可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。

    引进了QuickTest Professional 8.0中新一代的“零配置”关键词驱动测试技术,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。

    使用独特智能对象识别(Unique Smart Object Recognition)来发现对象,即使对象创建不断在改变,但仍可保证无监控方式脚本执行的可靠性。

    恢复管理器(Recovery Manager)可处理不可预知的应用意外事件,实现24x7的不间断测试,赶上测试项目的最后期限。

    自动文档技术把测试文档的建立与测试脚本的建立同步。

    通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值。

    为QA工程师提供全面的集成开发环境。

    通过使用QuickTest Professional和WinRunner集成的TSL资源,使您在Mercury WinRunner测试脚本上的投资得以保值。

    TestFusion报告可快速隔离和诊断缺陷。

    通过完善检查点,实现应用的全面验证。

    ================

    语气有点像广告。。。囧!!!没找到更详细的了。

  • oracle与sql server事务处理的比较(转贴)

    七明芝 发布于 2009-04-12 02:19:21

    摘 要:本文讨论了Oracle和SQL Server的在事务处理上的区别,并分析了其实现机制的差异。


    事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异。

    事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的一个问题,对这个问题的疏忽可能会导致应用程序逻辑错误以及效率低下。

    下面我们针对Oracle及SQL Server这两种当前广泛使用的大型数据库产品,探讨一下它们在事务处理方面的一些差异。如没有特殊说明,本文内容适用的数据库产品版本为Oracle9i及SQL Server 2000,其中的示例SQL语句,对于Oracle是在SQL*Plus中执行,而对于SQL Server 2000是在osql中执行。
    一.事务的概念

    事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。事务的一个典型例子是银行中的转帐操作,帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转帐操作中的两个步骤就构成一个事务。

    数据库中的事务还有如下ACID特征。

    ACID分别是四个英文单词的首写字母,这四个英文单词是Atomicity、Consistency、Isolation、Durability,分别翻译为原子性、一致性、隔离性、持久性。

    原子性:指事务中的操作,或者都完成,或者都取消。

    一致性:指事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。

    隔离性:指当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。

    持久性:指对事务发出COMMIT命令后,即使这时发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。

    对数据库中的数据修改都是在内存中完成的,这些修改的结果可能已经写到硬盘也可能没有写到硬盘,如果在操作过程中,发生断电或系统错误等故障,数据库可以保证未结束的事务对数据库的数据修改结果即使已经写入磁盘,在下次数据库启动后也会被全部撤销;而对于结束的事务,即使其修改的结果还未写入磁盘,在数据库下次启动后会通过事务日志中的记录进行“重做”,即把丢失的数据修改结果重新生成,并写入磁盘,从而保证结束事务对数据修改的永久化。这样也保证了事务中的操作要么全部完成,要么全部撤销。

    二.事务设置及类型的区别

    在SQL Server中有三种事务类型,分别是:隐式事务、显式事务、自动提交事务,缺省为自动提交。

    自动提交,是指对于用户发出的每条SQL语句,SQL Server都会自动开始一个事务,并且在执行后自动进行提交操作来完成这个事务,也可以说在这种事务模式下,一个SQL语句就是一个事务。

    显式事务,是指在自动提交模式下以Begin Transaction开始一个事务,以Commit或Rollback结束一个事务,以Commit结束事务是把事务中的修改永久化,即使这时发生断电这样的故障。例如下面是SQL Server中的一个显式事务的例子。

    Begin Tran

    Update emp Set ename=’Smith’ Where empno=7369

    Insert Into dept Values(60,’HR’,’GZh’)

    Commit

    隐式事务,是指在当前会话中用Set Implicit_Transactions On命令设置的事务类型,这时任何DML语句(Delete、Update、Insert)都会开始一个事务,而事务的结束也是用Commit或Rollback。

    在Oracle中没有SQL Server的这些事务类型,缺省情况下任何一个DML语句都会开始一个事务,直到用户发出Commit或Rollback操作,这个事务才会结束,这与SQL Server的隐式事务模式相似。

    三.事务隔离级别

    在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted、Read Committed、Read Repeatable、Serializable,其中Read Uncommitted与Read Committed为语句级别的,而Read Repeatable与Serializable是针对事务级别的。

    在Oracle和SQL Server中设置事务隔离级别的语句是相同的,都使用SQL92标准语法,即:

    Set Transaction Isolation Level Read Committed

    上面示例中的Read Committed可以被替换为其他三种隔离级别中的任意一种。

    1.SQL Server中的隔离级别及实现机制

    在SQL Server中提供了所有这四种隔离级别。

    下面我们讨论在SQL Server中,这几种隔离级别的含义及其实现方式。

    Read Uncommitted:一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是错误的,所以多数的数据库应用都不会使用这种隔离级别。

    Read Committed:这是SQL Server的缺省隔离级别,设置为这种隔离级别的事务只能读取其他事务已经提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。

    Read Repeatable:在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改变。SQL Server是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。

    Serializable:在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别。在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。

    2.Oracle中的隔离级别及实现机制

    在Oracle中,没有Read Uncommitted及Repeatable Read隔离级别,这样在Oracle中不允许一个会话读取其他事务未提交的数据修改结果,从而避免了由于事务回滚发生的读取错误。Oracle中的Read Committed和Serializable级别,其含义与SQL Server类似,但是实现方式却大不一样。

    在Oracle中,存在所谓的回滚段(Oracle9i之前版本)或撤销段(Oracle9i版本),Oracle在修改数据记录时,会把这些记录被修改之前的结果存入回滚段或撤销段中,就是因为这种机制,Oracle对于事务隔离级别的实现与SQL Server截然不同。在Oracle中,读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作,这样在Oracle中的各种隔离级别下,读取操作都不会等待更新事务结束,更新操作也不会因为另一个事务中的读取操作而发生等待,这也是Oracle事务处理的一个优势所在。

    Oracle缺省的设置是Read Committed隔离级别(也称为语句级别的隔离),在这种隔离级别下,如果一个事务正在对某个表进行DML操作,而这时另外一个会话对这个表的记录进行读取操作,则Oracle会去读取回滚段或撤销段中存放的更新之前的记录,而不会象SQL Server一样等待更新事务的结束。

    在Serializable隔离级别(也称为事务级别的隔离),事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。如果在读取时,其他事务正在对记录进行修改,则Oracle就会在回滚段或撤销段中去寻找对应的原来未经更改的记录(而且是在读取操作所在的事务开始之前存放于回滚段或撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。

    四.DDL语句对事务的影响

    1.Oracle中DDL语句对事务的影响

    在Oracle中,执行DDL语句(如Create Table、Create View等)时,会在执行之前自动发出一个Commit命令,并在随后发出一个Commit或者Rollback命令,也就是说,DDL会象如下伪码一样执行:

    Commit;

    DDL_Statement;

    If (Error) then

    Rollback;

    Else

    Commit;

    End if;

    我们通过分析下面例子来看Oracle中,DDL语句对事务的影响:

    Insert into some_table values(‘Before’);

    Creaate table T(x int);

    Insert into some_table values(‘After’);

    Rollback;

    由于在Oracle执行Create table语句之前进行了提交,而在Create table执行后也会自动发出Commit命令,所以只有插入After的行被回滚,而插入Before的行不会被回滚,Create table命令的结果也不会被回滚,即使Create table语句失败,所进行的Before插入也会被提交。如果最后发出Commit命令,因为插入Before及Create table的操作结果已经在之前提交,所以Commit命令影响的只有插入After的操作。

    2.SQL Server中DDL语句对事务的影响

    在SQL Server中,DDL语句对事务的影响与其他DML语句相同,也就是说,在DML语句发出之前或之后,都不会自动发出Commit命令。

    在SQL Server 2000中,对于与上面Oracle同样的例子,最后发出Rollback后,数据库会回滚到插入Before之前的状态,即插入Before和After的行都会被回滚,数据表T也不会被创建。

    如果最后发出Commit操作,则会把三个操作的结果全部提交。

    五.用户断开数据库连接对事务的影响

    另外,对应于Oracle的管理客户端工具SQL*Plus,在SQL Server 2000中是osql,两种管理工具都是命令行工具,使用方式及作用也类似,但是在SQL*Plus中,用户退出连接时,会自动先发出Commit命令,然后再退出,而在osql中,如果用户退出连接,会自动发出Rollback命令,这对于SQL Server的自动提交模式没有什么影响,但如果处于隐式事务模式,其影响是显而易见的。对于两种数据库产品的其他客户端管理工具也有类似的不同之处。

  • 转载~学习一种新的编程语言所要做的15个练习

    hbdxzap 发布于 2009-05-05 11:34:25

    转载地址:http://www.51testing.com/?action/viewspace/itemid/122037.html

     

       虽然我已经可以使用很多种编程语言进行工作,但我的工作常常会要求我快速掌握一门新的语言。我没有选择去阅读几百页的程序手册,而是快速浏览10到15页的教程(可以在Google中搜索),并把程序语言的语法参考说明印在小卡片上(在google里搜索language to learn+reference card就能找到)。

      首先,我会熟悉这种程序语言的编译器、编译选项、编辑器或集成开发环境的的快捷键和小技巧,写一个简单的“你好世界”程序,编译并运行它,再用调试器进行简单的调试,如设置断电、查看变量值、跳转到某一位置等。

      为了能够快速地掌握一种新的程序语言,我会做以下几个练习。注意,有些程序对初学者来说是很困难的。

      1、用无限循环语句显示一系列数字(1、2、3、4、5……),并设置当用户按下某个按钮时(如ESC键)程序就会中止;

      2、斐波那契数列、交换两个变量的值、从一组数据中找出最大最小值等;

      3、让用户输入一些数字或字符串,以升序或降序进行排列;

      4、雷诺数的计算公式是(D*v*rho)/mu,其中D为直径,v为速度,rho为密度,mu为黏性。编写一个程序,接收一组数据并计算雷诺数。如果小于2100,则显示“层流”;在2100至4000之间,则显示“暂态流”;大与4000则显示“湍流”(使用分支语句if else then);

      5、修改上面的程序,显示“开始新的计算?(是/否)”,如果选“是”,则重新输入一组数据;如果选“否”,则退出程序(使用循环语句)。如果mu 的值为0,程序是否会提示“除数为0”的错误?或是给出“程序崩溃”的提示?怎样处理这种情况呢?该程序语言里是否提供了这样的机制?(异常处理)

      6、编写一个科学计算器,包括加、减、乘、除、平方、立方、平方根、正弦、余弦、正切、阶乘、倒数、取模等操作;

      7、用不同的格式进行输出(比如四舍五入到5位数字、截取前四位数字、用0填充左边或右边、左右对齐等)(输入输出操作)

      8、将一个文本文件转换成网页文件(文件输入输出操作、字符串操作)

      9、时间和日期:获取系统当前时间并将其转换成不同的格式;

      10、创建一个文件名中含有时间日期的文件;

      12、输入一个HTML表格,将其转换为以逗号或制表符分隔的文件;

      13、实现自动换行的功能(看看Windows里记事本是怎样做的)

      14、在数组的开头、结尾和中间添加或删除元素;

      15、该程序语言是否支持以下特性:操作符重载、虚函数、引用、指针等;是否有命名空间、包、模块等;了解一下吧。

  • 看《我的青春谁做主》

    hbdxzap 发布于 2009-05-07 16:27:20

        今天,偷空把《我的青春谁做主》看完了。本来只打算每天看一点的,可是,这部电视剧太有诱惑力了,不看完,心痒痒。

        剧中人物与《奋斗》很相似,想当初,自己也是超级喜欢看《奋斗》,一部《奋斗》我看了不下5遍。唉...男朋友都对我无语啦!在情节上,《我的青春谁做主》跟《奋斗》还是有很大差别的。【我还是一如既往的喜欢米莱(应该是王洛丹),喜欢她的率性活泼和机灵】。

        这几天,自己在家里学习,也会思考下人生,结合看电视剧的感受,我觉得:女孩子也需要有自己的事业。看到这么一句话:用你的技能养活自己,并且生活得不错。真的很赞同这句话。为此,我也需要继续努力,学到可以生存下去的技能。

        有时候,男朋友会对我说:学习技能就是你的生存之道 ,你要用它来养活自己,可是,我当时却听不进去。我之前,总是懵懵懂懂的觉得,女孩子,可以工作上平庸点儿,找个 差不多的工作,让自己的生活充实一点就好,现在觉得,其实,掌握技能,知道自己该如何发展,这些都是很重要的。即使是女孩子,也需要有谋生的本领,不管这个女孩子是否有生存压力。毕竟,来人世一回,不求留下什么,但求可以实现自己的价值。

        PS:这部电视剧有一个地方我特别喜欢,很多人物对话都非常机智,这一点是可以学习的。这里就不摘录了。

        摘录一段很经典的句子:生命里总有一些话,眼里流泪,可你得笑着听;生命里总有一些时刻,肝肠寸断,可你必须挨着!

       

     

Open Toolbar