??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产成人精品女人久久久,久久青青草原亚洲av无码app,亚洲七七久久精品中文国产 http://www.shnenglu.com/lizhongxu2008/zh-cnFri, 09 May 2025 04:21:25 GMTFri, 09 May 2025 04:21:25 GMT60textbox与Calendar的绑?/title><link>http://www.shnenglu.com/lizhongxu2008/archive/2011/01/19/138927.html</link><dc:creator>xlz</dc:creator><author>xlz</author><pubDate>Wed, 19 Jan 2011 14:40:00 GMT</pubDate><guid>http://www.shnenglu.com/lizhongxu2008/archive/2011/01/19/138927.html</guid><wfw:comment>http://www.shnenglu.com/lizhongxu2008/comments/138927.html</wfw:comment><comments>http://www.shnenglu.com/lizhongxu2008/archive/2011/01/19/138927.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/lizhongxu2008/comments/commentRss/138927.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lizhongxu2008/services/trackbacks/138927.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%"> <tbody> <tr> <td> <div id="i8ocwms" class=cnt id=blog_text>protected void Page_Load(object sender, EventArgs e)<br>    {<br>        this.Calendar1.Attributes.Add("style", "display:none;border-width:1px;border-style:solid;border-collapse:collapse;z-index: 100; left: 0px;");<br>        TextBox1.Attributes.Add("onfocus", "javascript:document.getElementById('Calendar1').style.display=''");<br>    }<br>    protected void Calendar1_SelectionChanged(object sender, EventArgs e)<br>    {<br>        TextBox1.Text = this.Calendar1.SelectedDate.ToShortDateString();<br>        Calendar1.Attributes.Add("onblur", "javascript:document.getElementById('Calendar1').style.display='none'");<br>    }<br>    protected void Button1_Click(object sender, EventArgs e)<br>    {<br>        Console.Write(this.TextBox1.Text);<br></div> </td> </tr> </tbody> </table> <img src ="http://www.shnenglu.com/lizhongxu2008/aggbug/138927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lizhongxu2008/" target="_blank">xlz</a> 2011-01-19 22:40 <a href="http://www.shnenglu.com/lizhongxu2008/archive/2011/01/19/138927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软交换究竟是什么?http://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76830.htmlxlzxlzTue, 17 Mar 2009 01:58:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76830.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/76830.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76830.html#Feedback0http://www.shnenglu.com/lizhongxu2008/comments/commentRss/76830.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/76830.html        什么是软交换?在询问这L(fng)问题Ӟ我们l常?x)得Cpd特征的描qͼ(x)它是NGN的核?j),它具有开攄架构Q它能够实现呼叫控制与媒?a target=_blank>传输分离……

        思科pȝ亚太区NGN/VoIP首席技?/font>ND康认ؓ(f)Q尽?#8220;软交?#8221;是目前NGN讨论的热点,但是Z对它的概念仍然有些似是而非。他?“‘软交?#8217;q个术语可以说是从Softswitch译而得。Softswitchq一术语借用?jin)传l?a target=_blank>?sh)?/font>领域PSTN|中?#8216;?#8217;交换?#8216;switch’的概念,所不同的是其基于分l网上呼叫控制与媒体传输承蝲相分ȝ含义。国内一开始有人将Softswitch译ؓ(f)‘软交?#8217;。但?#8216;软交?#8217;q个译术语含义不够十分明晰Q单从字面上看很难人理解它I竟是设备系l概念还是体pLc(din)?#8221;

        D康指出Q我国电(sh)信业历来名词属性的、设备概念范畴的switch译ؓ(f)“交换?#8221;Q而将动名词属性的switching译ؓ(f)“交换”。X25switch译ؓ(f)X25交换机,ATMswitch译ؓ(f)ATM交换机,L2/L3 switch 译ؓ(f)二层/三层交换机。因此他Qؓ(f)学术研讨的严肃? 应该softswitch更ؓ(f)切地译?#8220;软交换机”。这只是译概念上的问题。不q从某一斚w来说Q对于Y交换概念的模p,也反映了(jin)产业界对于Y交换认识上在某些斚w依旧存在偏差Q存在着q分某一斚w的能力,或者是q分夸大?jin)Y交换功能的情c(din)甚臛_以说在很长的一D|_(d)软交换被Zؓ(f)?#8220;话”?jin),它被认?f)是一U代表着通信行业的未来,g无所不能的技术?

        软交?/span>是一U正在发展的概念Q包含许多功能。其核心(j)是一个采用标准化协议和应用编E接口(APIQ的开放体pȝ?/span>。这׃ؓ(f)W三方开发新应用和新业务敞开?jin)大门。Y交换体系l构的其它重要特性还包括应用分离Qde-couplingofapplicationsQ、呼叫控制和承蝲控制?/p>

        软交换是一U功能实体,Z一代网lNQN提供h实时性要求的业务的呼叫控制和q接控制功能Q是下一代网l呼叫与控制的核?j)?/p>

        单地看,软交换是实现传统E控交换机的“呼叫控制”功能的实?/span>Q但传统?#8220;呼叫控制”功能是和业务l合在一L(fng)Q不同的业务所需要的呼叫控制功能不同Q而Y交换是与业务无关的,q要求Y交换提供的呼叫控制功能是各种业务的基本呼叫控制?/p>

xlz 2009-03-17 09:58 发表评论
]]>
大本地网和双归属|概?/title><link>http://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76829.html</link><dc:creator>xlz</dc:creator><author>xlz</author><pubDate>Tue, 17 Mar 2009 01:54:00 GMT</pubDate><guid>http://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76829.html</guid><wfw:comment>http://www.shnenglu.com/lizhongxu2008/comments/76829.html</wfw:comment><comments>http://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lizhongxu2008/comments/commentRss/76829.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lizhongxu2008/services/trackbacks/76829.html</trackback:ping><description><![CDATA[        支持大本地网Q虚拟MSCQ组|?MSCServer集中攄在一个大区域Q可以由现网的几个地区构成,每个地区分配一个虚拟的MSCL(fng)Q的中心(j)Q将MGW拉远Q下攑ֈ各PSTN本地|(每个地区Q,采取集中控制、就q接入的Ҏ(gu)l徏一个大本地|,但提供的业务与现在的多个本地|没有区别,同样支持多区受各区间漫游?qing)O渔R制以?qing)区间话l及(qing)计费Q对其它|元来说Q完全相当于多个传统的本地网。可以很好地满“大容量,局所”的运营要求,有利于提高运l质量,便于UdC务的开展?nbsp;  <br>     <br>        支持双归属网l容?一个或多个MGW同时q接C个MSCServer上,q两个SERVER互ؓ(f)备䆾关系Q正常情况下两个MSCServer可以是负荷分担的Q也可以是完全主备方式提供业务。当其中一个MSCServer故障Ӟ另一个MSCServer能够立即接管故障MSCServer上的话务Q能完成人工或自动倒换。从而极大地提高大容量系l容灄能力。这U双归属|络容灾Ҏ(gu)在中国移动T1局获得应用?br> <img src ="http://www.shnenglu.com/lizhongxu2008/aggbug/76829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lizhongxu2008/" target="_blank">xlz</a> 2009-03-17 09:54 <a href="http://www.shnenglu.com/lizhongxu2008/archive/2009/03/17/76829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> C语言中的q算W及(qing)其优先Q{http://www.shnenglu.com/lizhongxu2008/archive/2009/03/13/76434.htmlxlzxlzFri, 13 Mar 2009 05:27:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/13/76434.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/76434.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/13/76434.html#Feedback0http://www.shnenglu.com/lizhongxu2008/comments/commentRss/76434.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/76434.html

 

优先U?/p>

q算W?/p>

名称或含?/p>

使用形式

l合方向

说明

1

[]

数组下标

数组名[帔R表达式]

左到?/p>


()

圆括?/p>

Q表辑ּQ?函数?形参?


.

成员选择Q对象)(j)

对象.成员?/p>


->

成员选择Q指针)(j)

对象指针->成员?/p>


2

-

负号q算W?/p>

-表达?/p>

叛_?/p>

单目q算W?/p>

(cd)

强制cd转换

(数据cd)表达?/p>


++

自增q算W?/p>

++变量?变量?+

单目q算W?/p>

--

自减q算W?/p>

--变量?变量?-

单目q算W?/p>

*

取D符

*指针变量

单目q算W?/p>

&

取地址q算W?/p>

&变量?/p>

单目q算W?/p>

!

逻辑非运符

!表达?/p>

单目q算W?/p>

~

按位取反q算W?/p>

~表达?/p>

单目q算W?/p>

sizeof

长度q算W?/p>

sizeof(表达?


3

/

?/p>

表达?表达?/p>

左到?/p>

双目q算W?/p>

*

?/p>

表达?表达?/p>

双目q算W?/p>

%

余数Q取模)(j)

整型表达?整型表达?/p>

双目q算W?/p>

4

+

?/p>

表达?表达?/p>

左到?/p>

双目q算W?/p>

-

?/p>

表达?表达?/p>

双目q算W?/p>

5

<<

左移

变量<<表达?/p>

左到?/p>

双目q算W?/p>

>>

右移

变量>>表达?/p>

双目q算W?/p>

6

>

大于

表达?gt;表达?/p>

左到?/p>

双目q算W?/p>

>=

大于{于

表达?gt;=表达?/p>

双目q算W?/p>

<

表达?lt;表达?/p>

双目q算W?/p>

<=

于{于

表达?lt;=表达?/p>

双目q算W?/p>

7

==

{于

表达?=表达?/p>

左到?/p>

双目q算W?/p>

!=

不等?/p>

表达?= 表达?/p>

双目q算W?/p>

8

&

按位?/p>

表达?amp;表达?/p>

左到?/p>

双目q算W?/p>

9

^

按位异或

表达式^表达?/p>

左到?/p>

双目q算W?/p>

10

|

按位?/p>

表达式|表达?/p>

左到?/p>

双目q算W?/p>

11

&&

逻辑?/p>

表达?amp;&表达?/p>

左到?/p>

双目q算W?/p>

12

||

逻辑?/p>

表达式||表达?/p>

左到?/p>

双目q算W?/p>

13

?:

条gq算W?/p>

表达?? 表达?: 表达?

叛_?/p>

三目q算W?/p>

14

=

赋D符

变量=表达?/p>

叛_?/p>


/=

除后赋?/p>

变量/=表达?/p>


*=

乘后赋?/p>

变量*=表达?/p>


%=

取模后赋?/p>

变量%=表达?/p>


+=

加后赋?/p>

变量+=表达?/p>


-=

减后赋?/p>

变量-=表达?/p>


<<=

左移后赋?/p>

变量<<=表达?/p>


>>=

右移后赋?/p>

变量>>=表达?/p>


&=

按位与后赋?/p>

变量&=表达?/p>


^=

按位异或后赋?/p>

变量^=表达?/p>


|=

按位或后赋?/p>

变量|=表达?/p>


15

,

逗号q算W?/p>

表达?表达?…

左到?/p>

从左向右序q算

说明Q?/p>

同一优先U的q算W,q算ơ序q合方向所军_?/p>

xlz 2009-03-13 13:27 发表评论
]]>
memset用法详解(转)(j)http://www.shnenglu.com/lizhongxu2008/archive/2009/03/11/76162.htmlxlzxlzTue, 10 Mar 2009 16:14:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/11/76162.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/76162.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/11/76162.html#Feedback0http://www.shnenglu.com/lizhongxu2008/comments/commentRss/76162.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/76162.html 

memest原型 (please type "man memset" in your shell) 

 void *memset(void *s,  int c, size_t n); 

memset:作用是在一D内存块中填充某个给定的|它对较大的结构体或数l进行清零操作的一U最快方法?/span>

常见的三U错?/strong>

W一: 搞反?jin)c ?nbsp;n的位|? 

一定要C 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 
而不?nbsp;memset(a, 20,  0) 

W二: q度使用memset, 我想q些E序员可能有某种?j)理阴?jing), 他们惧怕未l初始化的内? 所以他们会(x)写出q样的代? 

char buffer[20]; 

memset(buffer, 0, sizeof((char)*20)); 
strcpy(buffer, "123"); 

q里的memset是多余的. 因ؓ(f)q块内存马上p覆盖? 清零没有意义. 

W三: 其实q个错误严格来讲不能用错memset, 但是它经常在使用memset的场合出?/strong> 

int some_func(struct something *a){ 
 … 
 … 
 memset(a, 0, sizeof(a)); 
 … 

?/strong>:Z要用memset|零?memset( &Address, 0, sizeof(Address))Q经常看到这L(fng)用法Q其实不用的话,分配数据的时候,剩余的空间也?x)置零的?/p>

{?1.如果不清I,可能?x)在试当中出现野倹{?nbsp;你做下面的试验看看结?) 

char buf[5]Q?nbsp;

CString str,str1Q?nbsp;//memset(buf,0,sizeof(buf))Q?nbsp;for(int i = 0Qi<5Qi++) { str.Format(“%d “,buf[i])Q?nbsp;str1 +=str Q?nbsp;} TRACE(“%s\r\n“,str1)

2.其实不然Q特别是对于字符指针cd的,剩余的部分通常是不?x)?f)0?/span>Q不妨作一个试验,定义一个字W数l,q输入一串字W,如果不用memset实现清零Q用MessageBox昄出来׃(x)有ؕ码(0表示NULLQ如果有Q就默认字符l束Q不?x)输出后面的qQ?/p>

?

如下demo是可以的Q能把数l中的元素值都讄成字W?Q?br>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[5];
    memset(a,'1',5);
    for(int i = 0;i < 5;i++)
      cout<<a[i]<<"  ";
    system("pause");
    return 0;
}
而,如下E序惛_数组中的元素D|成1Q却是不可行?br>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int a[5];
    memset(a,1,5);//q里Ҏ(gu)memset(a,1,5 *sizeof(int))也是不可以的
    for(int i = 0;i < 5;i++)
      cout<<a[i]<<"  ";
    system("pause");
    return 0;
}
问题是:(x)

1Q第一个程序ؓ(f)什么可以,而第二个不行Q?br>2Q不惌用forQ或是while循环来初始化int a[5];能做到吗Q(有没有一个像memsetQ)(j)q样的函数初始化Q?br>

{?

1.因ؓ(f)W一个程序的数组a是字W型的,字符型占据内存大是1ByteQ而memset函数也是以字节ؓ(f)单位q行赋值的Q所以你输出没有问题。而第二个E序a是整型的Q用memsetq是按字节赋|q样赋值完以后Q每个数l元素的值实际上?x01010101卛_q制?6843009。你看看你输出结果是否这P 

2.如果用memset(a,1,20);
是对a指向的内存的20个字节进行赋|每个都用ASCII?的字W去填充Q{Zq制后,1是00000001,占一个字节。一个INT元素?字节Q合一起就?000000010000000100000001Q就{于16843009Q就完成?jin)对一个INT元素的赋g(jin)?/p>

 



xlz 2009-03-11 00:14 发表评论
]]>
l典W试分析http://www.shnenglu.com/lizhongxu2008/archive/2009/03/10/76149.htmlxlzxlzTue, 10 Mar 2009 13:35:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/10/76149.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/76149.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/03/10/76149.html#Feedback0http://www.shnenglu.com/lizhongxu2008/comments/commentRss/76149.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/76149.html阅读全文

xlz 2009-03-10 21:35 发表评论
]]>
atoi和itoa的C实现http://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73470.htmlxlzxlzWed, 11 Feb 2009 08:22:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73470.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/73470.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73470.html#Feedback1http://www.shnenglu.com/lizhongxu2008/comments/commentRss/73470.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/73470.html

#include<stdio.h>
int atoi(const char *str)
{
    int value=0;
    bool b_plus=true; //判断W号

    switch(*str) //qo(h)W号

    {
    case '+':
        str++;
        break;
    case '-':
        b_plus=false;
        str++;
        break;
    default:
        break;
    }

    while('\0' != *str)
    {
        value = (value*10)+(*str-'0');
        str++;
    }
    if(!b_plus)
        value=-value;
    return value;
}

void main()
{
    char str[]="-999";
    int value=atoi(str);
    printf("The result is:%d\n",value);
}

 

(2)itoa的实玎ͼ(x)

#include<stdio.h>
void itoa(int value, char *str)
{
    if (value < 0) //如果是负?则str[0]='-',q把value取反(变成正整?

    {
        str[0] = '-';
        value = 0-value;
    }
    int i,j;
    for(i=1; value > 0; i++,value/=10) //从value[1]开始存放value的数字字W,不过是逆序Q等下再反序q来

        str[i] = value%10+'0'; //数字加?的ASCII??0')得到该数字的ASCII?br>
    for(j=i-1,i=1; j-i>=1; j--,i++) //数字字W反序存?br>
    {
        str[i] = str[i]^str[j];
        str[j] = str[i]^str[j];
        str[i] = str[i]^str[j];
    }
    if(str[0] != '-') //如果不是负数Q则需要把数字字符下标左移一位,卛_1

    {
        for(i=0; str[i+1]!='\0'; i++)
            str[i] = str[i+1];
        str[i] = '\0';
    }
}

void main()
{
    int value = -1212345;
    char str[10] = {'\0'}; //记得把str全填充ؓ(f)'\0'

    itoa(value, str);
    printf("The result is:%s\n", str);
}



xlz 2009-02-11 16:22 发表评论
]]>
不调用库函数Q实现strcpy函数Q{帖)(j)http://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73456.htmlxlzxlzWed, 11 Feb 2009 06:10:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73456.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/73456.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/02/11/73456.html#Feedback2http://www.shnenglu.com/lizhongxu2008/comments/commentRss/73456.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/73456.html

题目Q?
    已知strcpy函数的原型是Q?
        char * strcpy(char * strDest,const char * strSrc);
    1.不调用库函数Q实现strcpy函数?
    2.解释Z么要q回char *?

    解说Q?
    1.strcpy的实C?


        char * strcpy(char * strDest,const char * strSrc)
        {
                if ((strDest==NULL)||(strsrc="/=NULL")) //[1]
                        throw "Invalid argument(s)"; //[2]
                char * strDestCopy=strDest;  //[3]
                while ((*strDest++=*strSrc++)!='\0'); //[4]
                return strDestCopy;
        }

    错误的做法:(x)
    [1]
    (A)不检查指针的有效性,说明{题者不注重代码的健壮性?
    (B)(g)查指针的有效性时使用((!strDest)||(!strSrc))?!(strDest&&strSrc))Q说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为boolx(chng)cd隐式转换Q这U功能虽然灵z,但更多的是导致出错概率增大和l护成本升高。所以C++专门增加?jin)bool、true、false三个关键字以提供更安全的条g表达式?
    (C)(g)查指针的有效性时使用((strDest==0)||(strsrc="/=0"))Q说明答题者不知道使用帔R的好处。直接用字面常量(如本例中?Q会(x)减少E序的可l护性?虽然单,但程序中可能出现很多处对指针的检查,万一出现W误Q编译器不能发现Q生成的E序内含逻辑错误Q很难排除。而用NULL代替0Q如果出现拼写错误,~译器就?x)检查出来?
    [2]
    (A)return new string("Invalid argument(s)");Q说明答题者根本不知道q回值的用途,q且他对内存泄漏也没有警惕心(j)。从函数中返回函C内分配的内存是十分危险的做法Q他把释攑ֆ存的义务抛给不知情的调用者,l大多数情况下,调用者不?x)释攑ֆ存,q导致内存泄漏?
    (B)return 0;Q说明答题者没有掌握异常机制。调用者有可能忘记(g)查返回|调用者还可能无法(g)查返回|见后面的铑ּ表达式)(j)。妄惌q回D负返回正值和异常值的双重功能Q其l果往往是两U功能都失效。应该以抛出异常来代替返回|q样可以减轻调用者的负担、错误不会(x)被忽略、增强程序的可维护性?
    [3]
    (A)忘记保存原始的strDest|说明{题者逻辑思维不严密?
    [4]
    (A)循环写成while (*strDest++=*strSrc++);Q同[1](B)?
    (B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;Q说明答题者对边界条g的检查不力。@环体l束后,strDest字符串的末尾没有正确地加?\0'?

    2.q回strDest的原始g函数能够支持铑ּ表达式,增加?jin)函数?#8220;附加?#8221;。同样功能的函数Q如果能合理地提高的可用性,自然更加理惟?
    铑ּ表达式的形式如:(x)
        int iLength=strlen(strcpy(strA,strB));
    又如Q?
        char * strA=strcpy(new char[10],strB);
    q回strSrc的原始值是错误的。其一Q源字符串肯定是已知的,q回它没有意义。其二,不能支持形如W二例的表达式。其三,Z(jin)保护源字W串QŞ参用const限定strSrc所指的内容Q把const char *作ؓ(f)char *q回Q类型不W,~译报错?/div>

xlz 2009-02-11 14:10 发表评论
]]>
oracle与sql server事务处理的比较(转脓(chung)Q?http://www.shnenglu.com/lizhongxu2008/archive/2009/01/04/71097.htmlxlzxlzSat, 03 Jan 2009 17:11:00 GMThttp://www.shnenglu.com/lizhongxu2008/archive/2009/01/04/71097.htmlhttp://www.shnenglu.com/lizhongxu2008/comments/71097.htmlhttp://www.shnenglu.com/lizhongxu2008/archive/2009/01/04/71097.html#Feedback0http://www.shnenglu.com/lizhongxu2008/comments/commentRss/71097.htmlhttp://www.shnenglu.com/lizhongxu2008/services/trackbacks/71097.html

?要:(x)本文讨论?jin)Oracle和SQL Server的在事务处理上的区别Qƈ分析?jin)其实现机制的差异?/p>

关键词:(x)OracleQSQL ServerQ事务;事务隔离U别QDDL?/p>

事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在q个斚wp?jin)很大精力,不同的事务处理方式?x)D数据库性能和功能上的巨大差异?/p>

事务处理也是数据库管理员?sh)数据库应用E序开发h员必Lȝ解的一个问题,对这个问题的疏忽可能?x)导致应用程序逻辑错误以及(qing)效率低下?/p>

下面我们针对Oracle?qing)SQL Serverq两U当前广泛用的大型数据库品,探讨一下它们在事务处理斚w的一些差异。如没有Ҏ(gu)说明Q本文内定w用的数据库产品版本为Oracle9i?qing)SQL Server 2000Q其中的CZSQL语句Q对于Oracle是在SQL*Plus中执行,而对于SQL Server 2000是在osql中执行?br>一.事务的概?/p>

事务可以看作是由Ҏ(gu)据库的若q操作组成的一个单元,q些操作要么都完成,要么都取消,从而保证数据满一致性的要求。事务的一个典型例子是银行中的转帐操作Q帐户A把一定数量的N转到帐户B上,q个操作包括两个步骤Q一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数量。这两个步骤昄要么都完成,要么都取消,否则银行׃(x)受损失。显?dng)q个转帐操作中的两个步骤构成一个事务?/p>

数据库中的事务还有如下ACID特征?/p>

ACID分别是四个英文单词的首写字母Q这四个英文单词是Atomicity、Consistency、Isolation、DurabilityQ分别翻译ؓ(f)原子性、一致性、隔L、持久性?/p>

原子性:(x)指事务中的操作,或者都完成Q或者都取消?/p>

一致性:(x)指事务中的操作保证数据库中的数据不会(x)出现逻辑上不一致的情况Q一致性一般会(x)隐含的包括在其他属性之中?/p>

隔离性:(x)指当前的事务与其他未完成的事务是隔离的。在不同的隔ȝ别下Q事务的d操作Q可以得到的l果是不同的?/p>

持久性:(x)指对事务发出COMMIT命o(h)后,即ɘq时发生pȝ故障Q事务的效果也被持久化了(jin)。与此相反的是,当在事务执行q程中,pȝ发生故障Q则事务的操作都被回滚,x(chng)据库回到事务开始之前的状态?/p>

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

?事务讄?qing)类型的区?/p>

在SQL Server中有三种事务cdQ分别是Q隐式事务、显式事务、自动提交事务,~省动提交?/p>

自动提交Q是指对于用户发出的每条SQL语句QSQL Server都会(x)自动开始一个事务,q且在执行后自动q行提交操作来完成这个事务,也可以说在这U事务模式下Q一个SQL语句是一个事务?/p>

昑ּ事务Q是指在自动提交模式下以Begin Transaction开始一个事务,以Commit或Rollbackl束一个事务,以Commitl束事务是把事务中的修改怹化,即ɘq时发生断电(sh)q样的故障。例如下面是SQL Server中的一个显式事务的例子?/p>

Begin Tran

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

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

Commit

隐式事务Q是指在当前?x)话中用Set Implicit_Transactions On命o(h)讄的事务类型,q时MDML语句(Delete、Update、Insert)都会(x)开始一个事务,而事务的l束也是用Commit或Rollback?/p>

在Oracle中没有SQL Server的这些事务类型,~省情况下Q何一个DML语句都会(x)开始一个事务,直到用户发出Commit或Rollback操作Q这个事务才?x)结束,q与SQL Server的隐式事务模式相伹{?/p>

?事务隔离U别

在SQL92标准中,事务隔离U别分ؓ(f)四种Q分别ؓ(f)QRead Uncommitted、Read Committed、Read Repeatable、SerializableQ其中Read Uncommitted与Read Committed句别的Q而Read Repeatable与Serializable是针对事务别的?/p>

在Oracle和SQL Server中设|事务隔ȝ别的语句是相同的Q都使用SQL92标准语法Q即Q?/p>

Set Transaction Isolation Level Read Committed

上面CZ中的Read Committed可以被替换ؓ(f)其他三种隔离U别中的L一U?/p>

1.SQL Server中的隔离U别?qing)实现机?/p>

在SQL Server中提供了(jin)所有这四种隔离U别?/p>

下面我们讨论在SQL Server中,q几U隔ȝ别的含义?qing)其实现方式?/p>

Read UncommittedQ一个会(x)话可以读取其他事务未提交的更新结果,如果q个事务最后以回滚l束Q这时的dl果可能是错误的,所以多数的数据库应用都不会(x)使用q种隔离U别?/p>

Read CommittedQ这是SQL Server的缺省隔ȝ别,讄U隔ȝ别的事务只能d其他事务已经提交的更新结果,否则Q发生等待,但是其他?x)话可以修改q个事务中被d的记录,而不必等待事务结束,昄Q在q种隔离U别下,一个事务中的两个相同的d操作Q其l果可能不同?/p>

Read RepeatableQ在一个事务中Q如果在两次相同条g的读取操作之间没有添加记录的操作Q也没有其他更新操作D在这个查询条件下记录数增多,则两ơ读取结果相同。换句话_(d)是在一个事务中W一ơ读取的记录保证不会(x)在这个事务期间发生改变。SQL Server是通过在整个事务期间给d的记录加锁实现这U隔ȝ别的Q这P在这个事务结束前Q其他会(x)话不能修改事务中d的记录,而只能等待事务结束,但是SQL Server不会(x)ȝ其他?x)话向表中添加记录,也不ȝ其他会(x)话修改其他记录?/p>

SerializableQ在一个事务中Q读取操作的l果是在q个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这U隔ȝ别。在q种隔离U别下,对这个表的所有DML操作都是不允许的Q即要等待事务结束,q样׃证了(jin)在一个事务中的两ơ读取操作的l果肯定是相同的?/p>

2.Oracle中的隔离U别?qing)实现机?/p>

在Oracle中,没有Read Uncommitted?qing)Repeatable Read隔离U别Q这样在Oracle中不允许一个会(x)话读取其他事务未提交的数据修改结果,从而避免了(jin)׃事务回滚发生的读取错误。Oracle中的Read Committed和SerializableU别Q其含义与SQL ServercMQ但是实现方式却大不一栗?/p>

在Oracle中,存在所谓的回滚D?Oracle9i之前版本)或撤销D?Oracle9i版本)QOracle在修Ҏ(gu)据记录时Q会(x)把这些记录被修改之前的结果存入回滚段或撤销D中Q就是因U机ӞOracle对于事务隔离U别的实CSQL Server截然不同。在Oracle中,d操作不会(x)ȝ更新操作Q更新操作也不会(x)ȝd操作Q这样在Oracle中的各种隔离U别下,d操作都不?x)等待更C务结束,更新操作也不?x)因为另一个事务中的读取操作而发生等待,q也是Oracle事务处理的一个优势所在?/p>

Oracle~省的设|是Read Committed隔离U别(也称句别的隔离)Q在q种隔离U别下,如果一个事务正在对某个表进行DML操作Q而这时另外一个会(x)话对q个表的记录q行d操作Q则Oracle?x)去d回滚D|撤销D中存放的更C前的记录Q而不?x)象SQL Server一L(fng)待更C务的l束?/p>

在Serializable隔离U别(也称Z务别的隔离)Q事务中的读取操作只能读取这个事务开始之前已l提交的数据l果。如果在dӞ其他事务正在对记录进行修改,则Oracle׃(x)在回滚段或撤销D中d扑֯应的原来未经更改的记?而且是在d操作所在的事务开始之前存放于回滚D|撤销D늚记录)Q这时读取操作也不会(x)因ؓ(f)相应记录被更新而等待?/p>

?DDL语句对事务的影响

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

在Oracle中,执行DDL语句(如Create Table、Create View{?Ӟ?x)在执行之前自动发出一个Commit命o(h)Qƈ在随后发Z个Commit或者Rollback命o(h)Q也是_(d)DDL?x)象如下伪码一h行:(x)

Commit;

DDL_Statement;

If (Error) then

Rollback;

Else

Commit;

End if;

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

Insert into some_table values(‘Before’);

Creaate table T(x int);

Insert into some_table values(‘After’);

Rollback;

׃在Oracle执行Create table语句之前q行?jin)提交,而在Create table执行后也?x)自动发出Commit命o(h)Q所以只有插入After的行被回滚,而插入Before的行不会(x)被回滚,Create table命o(h)的结果也不会(x)被回滚,即Create table语句p|Q所q行的Before插入也会(x)被提交。如果最后发出Commit命o(h)Q因为插入Before?qing)Create table的操作结果已l在之前提交Q所以Commit命o(h)影响的只有插入After的操作?/p>

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

在SQL Server中,DDL语句对事务的影响与其他DML语句相同Q也是_(d)在DML语句发出之前或之后,都不?x)自动发出Commit命o(h)?/p>

在SQL Server 2000中,对于与上面Oracle同样的例子,最后发出Rollback后,数据库会(x)回滚到插入Before之前的状态,x(chng)入Before和After的行都会(x)被回滚,数据表T也不?x)被创徏?/p>

如果最后发出Commit操作Q则?x)把三个操作的结果全部提交?/p>

?用户断开数据库连接对事务的媄(jing)?/p>

另外Q对应于Oracle的管理客L(fng)工具SQL*PlusQ在SQL Server 2000中是osqlQ两U管理工具都是命令行工具Q用方式及(qing)作用也类|但是在SQL*Plus中,用户退?gu)接时Q会(x)自动先发出Commit命o(h)Q然后再退出,而在osql中,如果用户退?gu)接,会(x)自动发出Rollback命o(h)Q这对于SQL Server的自动提交模式没有什么媄(jing)响,但如果处于隐式事务模式,其媄(jing)响是显而易见的。对于两U数据库产品的其他客L(fng)理工具也有cM的不同之处?/p>

xlz 2009-01-04 01:11 发表评论
]]>
ҹƷþþþþ| Ʒ˾þ˵Ӱ| þþƷɧ| ۺϾþۺ| þþƷѿ| Ʒþþþ㽶| ȫɫƴɫƬѾþþ| ޾þһح| þó˾ƷƵ| ɫþþþþۺ| 99þ99þþƷƬ| þþƷ| þëƬһ| 99þþƷž޾Ʒ| ɫݺݾþAVۺ| Ҫþðѹۿ| ޹˾þþƷӰ | ҹҹݺݾþAV| ľƷþþþùַ| 츾þþ| ɫۺϾþþþĻ| þۺ˿ձ| þԭavapp| ˾þô߽ۺվ| ھƷþþþþ鶹| þþþþþۺ| Ʒ׾þAAAƬ69| ˺ݺۺϾþ޸| 99þ99þþƷƬ| һþ㽶߿ۿ| AVһþ| þAV| ƷþþĻһ | þù| þó˹Ʒһ| 97þþƷˬ| ݹƷþ| 91Ʒɫ۾þ | þþƷŷƬ| þþAVҰ| ڸþþþþ|