• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 9, comments - 4, trackbacks - 0, articles - 9

            2011年1月19日

            protected void Page_Load(object sender, EventArgs e)
                {
                    this.Calendar1.Attributes.Add("style", "display:none;border-width:1px;border-style:solid;border-collapse:collapse;z-index: 100; left: 0px;");
                    TextBox1.Attributes.Add("onfocus", "javascript:document.getElementById('Calendar1').style.display=''");
                }
                protected void Calendar1_SelectionChanged(object sender, EventArgs e)
                {
                    TextBox1.Text = this.Calendar1.SelectedDate.ToShortDateString();
                    Calendar1.Attributes.Add("onblur", "javascript:document.getElementById('Calendar1').style.display='none'");
                }
                protected void Button1_Click(object sender, EventArgs e)
                {
                    Console.Write(this.TextBox1.Text);

            posted @ 2011-01-19 22:40 xlz 閱讀(641) | 評論 (1)編輯 收藏

            2009年3月17日

                    什么是軟交換?在詢問這樣的問題時,我們經常會得到一系列特征的描述:它是NGN的核心,它具有開放的架構,它能夠實現呼叫控制與媒體傳輸分離……

                    思科系統亞太區NGN/VoIP首席技術顧問殷康認為,盡管“軟交換”是目前NGN討論的熱點,但是人們對它的概念仍然有些似是而非。他說:“‘軟交換’這個術語可以說是從Softswitch翻譯而得。Softswitch這一術語借用了傳統電信領域PSTN網中的‘硬’交換機‘switch’的概念,所不同的是強調其基于分組網上呼叫控制與媒體傳輸承載相分離的含義。國內一開始有人將Softswitch譯為‘軟交換’。但是‘軟交換’這個翻譯術語含義不夠十分明晰,單從字面上看很難使人理解它究竟是設備系統概念還是體系概念。”

                    殷康指出,我國電信業歷來將名詞屬性的、設備概念范疇的switch譯為“交換機”,而將動名詞屬性的switching譯為“交換”。X25switch譯為X25交換機,ATMswitch譯為ATM交換機,L2/L3 switch 譯為二層/三層交換機。因此他建議,為學術研討的嚴肅性, 應該將softswitch更為確切地譯為“軟交換機”。這只是翻譯概念上的問題。不過從某一方面來說,對于軟交換概念的模糊,也反映了產業界對于軟交換認識上在某些方面依舊存在偏差,存在著過分強調某一方面的能力,或者是過分夸大了軟交換功能的情況。甚至可以說在很長的一段時間,軟交換被人為地“神話”了,它被認為是一種代表著通信行業的未來,似乎無所不能的技術。

                    軟交換是一種正在發展的概念,包含許多功能。其核心是一個采用標準化協議和應用編程接口(API)的開放體系結構。這就為第三方開發新應用和新業務敞開了大門。軟交換體系結構的其它重要特性還包括應用分離(de-couplingofapplications)、呼叫控制和承載控制。

                    軟交換是一種功能實體,為下一代網絡NGN提供具有實時性要求的業務的呼叫控制和連接控制功能,是下一代網絡呼叫與控制的核心。

                    簡單地看,軟交換是實現傳統程控交換機的“呼叫控制”功能的實體,但傳統的“呼叫控制”功能是和業務結合在一起的,不同的業務所需要的呼叫控制功能不同,而軟交換是與業務無關的,這要求軟交換提供的呼叫控制功能是各種業務的基本呼叫控制。

            posted @ 2009-03-17 09:58 xlz 閱讀(464) | 評論 (0)編輯 收藏

                    支持大本地網(虛擬MSC)組網 MSCServer集中放置在一個大區域(可以由現網的幾個地區構成,每個地區分配一個虛擬的MSC號碼)的中心,將MGW拉遠,下放到各PSTN本地網(每個地區),采取集中控制、就近接入的方法組建一個大本地網,但提供的業務與現在的多個本地網沒有區別,同樣支持多區號、各區間漫游及漫游限制以及區間話統及計費,對其它網元來說,完全相當于多個傳統的本地網。可以很好地滿足“大容量,少局所”的運營要求,有利于提高運維質量,便于移動新業務的開展。   
                 
                    支持雙歸屬網絡容災 一個或多個MGW同時連接到兩個MSCServer上,這兩個SERVER互為備份關系,正常情況下兩個MSCServer可以是負荷分擔的,也可以是完全主備方式提供業務。當其中一個MSCServer故障時,另一個MSCServer能夠立即接管故障MSCServer上的話務,能完成人工或自動倒換。從而極大地提高大容量系統容災的能力。這種雙歸屬網絡容災方案在中國移動T1局獲得應用。

            posted @ 2009-03-17 09:54 xlz 閱讀(529) | 評論 (0)編輯 收藏

            2009年3月13日

             

            優先級

            運算符

            名稱或含義

            使用形式

            結合方向

            說明

            1

            []

            數組下標

            數組名[常量表達式]

            左到右


            ()

            圓括號

            (表達式)/函數名(形參表)


            .

            成員選擇(對象)

            對象.成員名


            ->

            成員選擇(指針)

            對象指針->成員名


            2

            -

            負號運算符

            -表達式

            右到左

            單目運算符

            (類型)

            強制類型轉換

            (數據類型)表達式


            ++

            自增運算符

            ++變量名/變量名++

            單目運算符

            --

            自減運算符

            --變量名/變量名--

            單目運算符

            *

            取值運算符

            *指針變量

            單目運算符

            &

            取地址運算符

            &變量名

            單目運算符

            !

            邏輯非運算符

            !表達式

            單目運算符

            ~

            按位取反運算符

            ~表達式

            單目運算符

            sizeof

            長度運算符

            sizeof(表達式)


            3

            /

            表達式/表達式

            左到右

            雙目運算符

            *

            表達式*表達式

            雙目運算符

            %

            余數(取模)

            整型表達式/整型表達式

            雙目運算符

            4

            +

            表達式+表達式

            左到右

            雙目運算符

            -

            表達式-表達式

            雙目運算符

            5

            <<

            左移

            變量<<表達式

            左到右

            雙目運算符

            >>

            右移

            變量>>表達式

            雙目運算符

            6

            >

            大于

            表達式>表達式

            左到右

            雙目運算符

            >=

            大于等于

            表達式>=表達式

            雙目運算符

            <

            小于

            表達式<表達式

            雙目運算符

            <=

            小于等于

            表達式<=表達式

            雙目運算符

            7

            ==

            等于

            表達式==表達式

            左到右

            雙目運算符

            !=

            不等于

            表達式!= 表達式

            雙目運算符

            8

            &

            按位與

            表達式&表達式

            左到右

            雙目運算符

            9

            ^

            按位異或

            表達式^表達式

            左到右

            雙目運算符

            10

            |

            按位或

            表達式|表達式

            左到右

            雙目運算符

            11

            &&

            邏輯與

            表達式&&表達式

            左到右

            雙目運算符

            12

            ||

            邏輯或

            表達式||表達式

            左到右

            雙目運算符

            13

            ?:

            條件運算符

            表達式1? 表達式2: 表達式3

            右到左

            三目運算符

            14

            =

            賦值運算符

            變量=表達式

            右到左


            /=

            除后賦值

            變量/=表達式


            *=

            乘后賦值

            變量*=表達式


            %=

            取模后賦值

            變量%=表達式


            +=

            加后賦值

            變量+=表達式


            -=

            減后賦值

            變量-=表達式


            <<=

            左移后賦值

            變量<<=表達式


            >>=

            右移后賦值

            變量>>=表達式


            &=

            按位與后賦值

            變量&=表達式


            ^=

            按位異或后賦值

            變量^=表達式


            |=

            按位或后賦值

            變量|=表達式


            15

            ,

            逗號運算符

            表達式,表達式,…

            左到右

            從左向右順序運算

            說明:

            同一優先級的運算符,運算次序由結合方向所決定。

            posted @ 2009-03-13 13:27 xlz 閱讀(291) | 評論 (0)編輯 收藏

            2009年3月11日

             

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

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

            memset:作用是在一段內存塊中填充某個給定的值,它對較大的結構體或數組進行清零操作的一種最快方法。

            常見的三種錯誤

            第一: 搞反了c 和 n的位置. 

            一定要記住 如果要把一個char a[20]清零, 一定是 memset(a, 0, 20) 
            而不是 memset(a, 20,  0) 

            第二: 過度使用memset, 我想這些程序員可能有某種心理陰影, 他們懼怕未經初始化的內存, 所以他們會寫出這樣的代碼: 

            char buffer[20]; 

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

            這里的memset是多余的. 因為這塊內存馬上就被覆蓋了, 清零沒有意義. 

            第三: 其實這個錯誤嚴格來講不能算用錯memset, 但是它經常在使用memset的場合出現 

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

            :為何要用memset置零?memset( &Address, 0, sizeof(Address));經常看到這樣的用法,其實不用的話,分配數據的時候,剩余的空間也會置零的。

            答:1.如果不清空,可能會在測試當中出現野值。 你做下面的試驗看看結果() 

            char buf[5]; 

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

            2.其實不然!特別是對于字符指針類型的,剩余的部分通常是不會為0的,不妨作一個試驗,定義一個字符數組,并輸入一串字符,如果不用memset實現清零,使用MessageBox顯示出來就會有亂碼(0表示NULL,如果有,就默認字符結束,不會輸出后面的亂碼)

            問:

            如下demo是可以的,能把數組中的元素值都設置成字符1
            #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;
            }
            而,如下程序想吧數組中的元素值設置成1,卻是不可行的
            #include <iostream>
            #include <cstring>
            using namespace std;
            int main()
            {
                int a[5];
                memset(a,1,5);//這里改成memset(a,1,5 *sizeof(int))也是不可以的
                for(int i = 0;i < 5;i++)
                  cout<<a[i]<<"  ";
                system("pause");
                return 0;
            }
            問題是:

            1,第一個程序為什么可以,而第二個不行,
            2,不想要用for,或是while循環來初始化int a[5];能做到嗎?(有沒有一個像memset()這樣的函數初始化)

            答:

            1.因為第一個程序的數組a是字符型的,字符型占據內存大小是1Byte,而memset函數也是以字節為單位進行賦值的,所以你輸出沒有問題。而第二個程序a是整型的,使用memset還是按字節賦值,這樣賦值完以后,每個數組元素的值實際上是0x01010101即十進制的16843009。你看看你輸出結果是否這樣? 

            2.如果用memset(a,1,20);
            就是對a指向的內存的20個字節進行賦值,每個都用ASCII為1的字符去填充,轉為二進制后,1就是00000001,占一個字節。一個INT元素是4字節,合一起就是1000000010000000100000001,就等于16843009,就完成了對一個INT元素的賦值了。

             

            posted @ 2009-03-11 00:14 xlz 閱讀(272) | 評論 (0)編輯 收藏

            2009年3月10日

                 摘要: 1、   用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)     #define  SECONDS_PER_YEAR  (60 * 60 * 24 * 365)UL     1) #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等) ...  閱讀全文

            posted @ 2009-03-10 21:35 xlz 閱讀(257) | 評論 (0)編輯 收藏

            2009年2月11日

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

                switch(*str) //過濾符號

                {
                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的實現:

            #include<stdio.h>
            void itoa(int value, char *str)
            {
                if (value < 0) //如果是負數,則str[0]='-',并把value取反(變成正整數)

                {
                    str[0] = '-';
                    value = 0-value;
                }
                int i,j;
                for(i=1; value > 0; i++,value/=10) //從value[1]開始存放value的數字字符,不過是逆序,等下再反序過來

                    str[i] = value%10+'0'; //將數字加上0的ASCII值(即'0')就得到該數字的ASCII值

                for(j=i-1,i=1; j-i>=1; j--,i++) //將數字字符反序存放

                {
                    str[i] = str[i]^str[j];
                    str[j] = str[i]^str[j];
                    str[i] = str[i]^str[j];
                }
                if(str[0] != '-') //如果不是負數,則需要把數字字符下標左移一位,即減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全填充為'\0'

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

            posted @ 2009-02-11 16:22 xlz 閱讀(3214) | 評論 (1)編輯 收藏

            題目:
                已知strcpy函數的原型是:
                    char * strcpy(char * strDest,const char * strSrc);
                1.不調用庫函數,實現strcpy函數。
                2.解釋為什么要返回char *。

                解說:
                1.strcpy的實現代碼


                    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;
                    }

                錯誤的做法:
                [1]
                (A)不檢查指針的有效性,說明答題者不注重代碼的健壯性。
                (B)檢查指針的有效性時使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),說明答題者對C語言中類型的隱式轉換沒有深刻認識。在本例中char *轉換為bool即是類型隱式轉換,這種功能雖然靈活,但更多的是導致出錯概率增大和維護成本升高。所以C++專門增加了bool、true、false三個關鍵字以提供更安全的條件表達式。
                (C)檢查指針的有效性時使用((strDest==0)||(strsrc="/=0")),說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)會減少程序的可維護性。0雖然簡單,但程序中可能出現很多處對指針的檢查,萬一出現筆誤,編譯器不能發現,生成的程序內含邏輯錯誤,很難排除。而使用NULL代替0,如果出現拼寫錯誤,編譯器就會檢查出來。
                [2]
                (A)return new string("Invalid argument(s)");,說明答題者根本不知道返回值的用途,并且他對內存泄漏也沒有警惕心。從函數中返回函數體內分配的內存是十分危險的做法,他把釋放內存的義務拋給不知情的調用者,絕大多數情況下,調用者不會釋放內存,這導致內存泄漏。
                (B)return 0;,說明答題者沒有掌握異常機制。調用者有可能忘記檢查返回值,調用者還可能無法檢查返回值(見后面的鏈式表達式)。妄想讓返回值肩負返回正確值和異常值的雙重功能,其結果往往是兩種功能都失效。應該以拋出異常來代替返回值,這樣可以減輕調用者的負擔、使錯誤不會被忽略、增強程序的可維護性。
                [3]
                (A)忘記保存原始的strDest值,說明答題者邏輯思維不嚴密。
                [4]
                (A)循環寫成while (*strDest++=*strSrc++);,同[1](B)。
                (B)循環寫成while (*strSrc!='\0') *strDest++=*strSrc++;,說明答題者對邊界條件的檢查不力。循環體結束后,strDest字符串的末尾沒有正確地加上'\0'。

                2.返回strDest的原始值使函數能夠支持鏈式表達式,增加了函數的“附加值”。同樣功能的函數,如果能合理地提高的可用性,自然就更加理想。
                鏈式表達式的形式如:
                    int iLength=strlen(strcpy(strA,strB));
                又如:
                    char * strA=strcpy(new char[10],strB);
                返回strSrc的原始值是錯誤的。其一,源字符串肯定是已知的,返回它沒有意義。其二,不能支持形如第二例的表達式。其三,為了保護源字符串,形參用const限定strSrc所指的內容,把const char *作為char *返回,類型不符,編譯報錯。

            posted @ 2009-02-11 14:10 xlz 閱讀(8630) | 評論 (2)編輯 收藏

            2009年1月4日

            摘 要:本文討論了Oracle和SQL Server的在事務處理上的區別,并分析了其實現機制的差異。

            關鍵詞:Oracle;SQL Server;事務;事務隔離級別;DDL。


            事務處理是所有大型數據庫產品的一個關鍵問題,各數據庫廠商都在這個方面花費了很大精力,不同的事務處理方式會導致數據庫性能和功能上的巨大差異。

            事務處理也是數據庫管理員與數據庫應用程序開發人員必須深刻理解的一個問題,對這個問題的疏忽可能會導致應用程序邏輯錯誤以及效率低下。

            下面我們針對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的自動提交模式沒有什么影響,但如果處于隱式事務模式,其影響是顯而易見的。對于兩種數據庫產品的其他客戶端管理工具也有類似的不同之處。

            posted @ 2009-01-04 01:11 xlz 閱讀(387) | 評論 (0)編輯 收藏

            久久e热在这里只有国产中文精品99| 99久久99久久精品国产片果冻| 波多野结衣中文字幕久久| 久久久久香蕉视频| 久久免费高清视频| 久久精品国产亚洲AV电影| 人妻无码αv中文字幕久久| 欧美午夜精品久久久久久浪潮| 久久九九亚洲精品| 国产精品天天影视久久综合网| 99精品久久精品一区二区| 色狠狠久久综合网| 国产精品久久久久久久app| 久久久久99这里有精品10 | 久久精品www| 久久久青草久久久青草| 日本道色综合久久影院| 91久久精品国产免费直播| 伊人久久免费视频| 国产精自产拍久久久久久蜜| 久久亚洲国产中v天仙www| 久久精品国内一区二区三区| 久久99精品久久久久久秒播| 久久久久亚洲?V成人无码| 久久精品成人欧美大片| 思思久久99热免费精品6| 久久久久久久波多野结衣高潮| 99久久精品免费看国产一区二区三区| 亚洲国产一成人久久精品| WWW婷婷AV久久久影片| 国产精品成人久久久久久久| 欧美日韩精品久久久久| 亚洲AV日韩精品久久久久| 国产精品美女久久久久网| 久久影院午夜理论片无码| 久久久久久久97| 久久福利青草精品资源站免费 | 国产人久久人人人人爽| 日本精品久久久中文字幕| 亚洲精品tv久久久久久久久久| 人妻丰满AV无码久久不卡|