隨筆-14  評論-142  文章-0  trackbacks-0
            2006年6月16日

          1, 臟讀

          一個事務(wù)讀到另一個事務(wù),尚未提交的修改,就是臟讀。這里所謂的修改,除了Update操作,不要忘了,還包括
          Insert和Delete操作。

          臟讀的后果:如果后一個事務(wù)回滾,那么它所做的修改,統(tǒng)統(tǒng)都會被撤銷。前一個事務(wù)讀到的數(shù)據(jù),就是垃圾數(shù)據(jù)。


          舉個例子:預(yù)訂房間。
          有一張Reservation表,往表中插入一條記錄,來訂購一個房間。

           事務(wù)1:在Reservation表中插入一條記錄,用于預(yù)訂99號房間。

           事務(wù)2:查詢,尚未預(yù)定的房間列表,因?yàn)?9號房間,已經(jīng)被事務(wù)1預(yù)訂。所以不在列表中。

           事務(wù)1:信用卡付款。由于付款失敗,導(dǎo)致整個事務(wù)回滾。
                  所以插入到Reservation 表中的記錄并不置為持久(即它將被刪除)。

          現(xiàn)在99號房間則為可用。
          所以,事務(wù)2所用的是一個無效的房間列表,因?yàn)?9號房間,已經(jīng)可用。如果它是最后一個沒有被預(yù)定的房間,那么這將是一個嚴(yán)重的失誤。

          注:臟讀的后果很嚴(yán)重。

           

          2,不可重復(fù)讀。

          在同一個事務(wù)中,再次讀取數(shù)據(jù)時【就是你的select操作】,所讀取的數(shù)據(jù),和第1次讀取的數(shù)據(jù),不一樣了。就是不可重復(fù)讀。

          舉個例子:
           事務(wù)1:查詢有雙人床房間。99號房間,有雙人床。

           事務(wù)2:將99號房間,改成單人床房間。

           事務(wù)1:再次執(zhí)行查詢,請求所有雙人床房間列表,99號房間不再列表中了。也就是說,
                         事務(wù)1,可以看到其他事務(wù)所做的修改。


          在不可重復(fù)讀,里面,可以看到其他事務(wù)所做的修改,而導(dǎo)致2次的查詢結(jié)果不再一樣了。
          這里的修改,是提交過的。也可以是沒有提交的,這種情況同時也是臟讀。

          如果,數(shù)據(jù)庫系統(tǒng)的隔離級別。允許,不可重復(fù)讀。那么你啟動一個事務(wù),并做一個select查詢操作。
          查詢到的數(shù)據(jù),就有可能,和你第2次,3次...n次,查詢到的數(shù)據(jù)不一樣。一般情況下,你只會做一次,select
          查詢,并以這一次的查詢數(shù)據(jù),作為后續(xù)計算的基礎(chǔ)。因?yàn)樵试S出現(xiàn),不可重復(fù)讀。那么任何
          時候,查詢到的數(shù)據(jù),都有可能被其他事務(wù)更新,查詢的結(jié)果將是不確定的。


          注:如果允許,不可重復(fù)讀,你的查詢結(jié)果,將是不確定的。一個不確定的結(jié)果,你能容忍嗎?


          3,幻讀

           

          事務(wù)1讀取指定的where子句所返回的一些行。然后,事務(wù)2插入一個新行,這個新行也滿足事務(wù)1使用的查詢
          where子句。然后事務(wù)1再次使用相同的查詢讀取行,但是現(xiàn)在它看到了事務(wù)2剛插入的行。這個行被稱為幻象,
          因?yàn)閷κ聞?wù)1來說,這一行的出現(xiàn)是不可思議的。

          舉個例子:
          事務(wù)1:請求沒有預(yù)定的,雙人床房間列表。
          事務(wù)2:向Reservation表中插入一個新紀(jì)錄,以預(yù)訂99號房間,并提交。
          事務(wù)1:再次請求有雙人床的未預(yù)定的房間列表,99號房間,不再位于列表中。


          注:幻讀,針對的是,Insert操作。如果事務(wù)2,插入的記錄,沒有提交。那么同時也是臟讀。

           

           

           

           

           

           


           

          posted @ 2009-04-13 12:37 liulang 閱讀(7335) | 評論 (0)編輯 收藏

           clob = rs.getClob(fieldName);

           String  rtn=clob.getSubString((long)1,(int)clob.length());

          posted @ 2009-04-08 12:17 liulang 閱讀(3206) | 評論 (3)編輯 收藏
          在resin3.0中,deploy是默認(rèn)的發(fā)布目錄,在MyEclipse中直接發(fā)布到resin的deploy目錄中,起動服務(wù)器就會運(yùn)行發(fā)布的項(xiàng)目,而在resin-3.1.1中發(fā)布到deploy目錄下的項(xiàng)目不回運(yùn)行,需要修改conf目錄下的resin.conf文件,用editplus等文本編輯器打開,大概在229行左右,有一行 <web-app-deploy path="webapps"/>是建產(chǎn)發(fā)布目錄路徑的,我們在后邊加上一行 <web-app-deploy path="deploy"/>,這樣在deploy目錄下的項(xiàng)目就能正常運(yùn)行了。
          posted @ 2009-04-07 10:22 liulang 閱讀(696) | 評論 (0)編輯 收藏
               摘要: java折半查找算法  閱讀全文
          posted @ 2007-09-06 18:02 liulang 閱讀(5234) | 評論 (4)編輯 收藏
               摘要: 這是面試的時候,最后一道算法題, 可能不習(xí)慣手寫代碼, 做錯了,太沒面子了...
          回來一上機(jī)就寫出來了!
            閱讀全文
          posted @ 2007-09-05 17:04 liulang 閱讀(6514) | 評論 (5)編輯 收藏
               摘要: 面試?yán)峡歼@個,都背熟了
            閱讀全文
          posted @ 2007-09-05 16:58 liulang 閱讀(94841) | 評論 (32)編輯 收藏
               摘要:   閱讀全文
          posted @ 2006-10-04 06:47 liulang 閱讀(597) | 評論 (0)編輯 收藏

          靜態(tài)單鏈表 :

          線性表的靜態(tài)單鏈表存儲結(jié)構(gòu) :

          #define MAXSIZE 100;

          ?

          typedef struct{

          ?

          ? ElemType data;

          ? int cur;

          ?

          }component,SLinkList[MAXSIZE];

          ?

          分析 :

          這種描述方法便于在不設(shè) 指針 類型的高級程序設(shè)計語言中 , 使用的鏈表結(jié)構(gòu) . 數(shù)組的零分量可看成頭節(jié)點(diǎn) . 這種結(jié)構(gòu)仍然需要預(yù)先分配一個較大的空間 . 但在插入和刪除的時候 , 不需要移動元素 . 僅需要修改指針 . 所以仍然具有鏈?zhǔn)酱鎯Y(jié)構(gòu)的主要優(yōu)點(diǎn) .

          ?

          基本操作 :

          (1) ?? 在靜態(tài)單鏈表中 , 查找第一個值為 e 的元素 .

          int LocateElem_L(SLinkList S, ElemType e)

          {

          ?

          ?? i = S[0].cur;

          ?? while(i && S[i].data != e) i=S[i].cur;

          ?? return i;

          ?

          }

          分析 :

          如果找不到相應(yīng)的元素 , 返回值為 0.


          (2) ???? 將一維數(shù)組 space 中的各個分量 , 鏈成一個備用的鏈表 .

          space[0].cur 為頭指針 .

          ?

          void InitSpace(SLinkList &space){

          ?

          ?

          ?? for(i =0;i<MAXSIZE-1;++i)

          ????? space[i].cur = i+1;

          ?? space[MAXSIZE-1].cur =0;

          ?

          }

          ?

          (3) ?? 如果備用空間的鏈表非空 , 則返回分配的節(jié)點(diǎn)下標(biāo) ,

          否則 , 返回 0;

          ?

          int Malloc_SL(SLinkList &space){

          ?

          ?? i=space[0].cur;

          ?? if(space[0].cur)

          ????? space[0].cur =space[i].cur;

          ?? return i;

          }

          (4) 將下標(biāo)為 k 的空閑節(jié)點(diǎn)回收到備用鏈表 .

          void Free_SL(SLinkList &space,int k)

          {

          space[k].cur =space[0].cur;

          space[0].cur = k;

          }


          (4) ?? 計算集合運(yùn)算 (A-B ) (B-A)

          假設(shè)由終端輸入集合元素 , 先建立表示集合 A 的靜態(tài)鏈表 S, 然后在輸入集合 B 的元素的同時查找 S , 如果存在相同的元素 , 則從 S 表中刪除 , 否則將其插入到 S 表中 .

          具體代碼如下 :

          void difference(SLinkList &space , int &s)

          {

          ?

          ????? InitSpace_SL(space);

          ????? s = Malloc_SL(space);

          ????? r=s;

          ????? scanf(m,n);

          ????? for(j=1;j<=m;++j)

          {???? i =Malloc_SL(space);

          ?????????? scanf(space[i].data);

          ?????????? space[r].cur =i;

          ?????????? r=i;

          ????? }? space[r].cur=0;

          for (j=1;j<=n;++j){

          ??? scanf(b);

          ??? p=s;k=space[s].cur;

          ??? while(k!=space[r].cur && space[k].data !=b)

          ??? { p=k;k=space[k].cur;}

          if (k==space[r].cur)

          {

          ??? ?? i = Malloc_SL(space);

          ??? ?? space[i].data = b;

          ??? ?? space[i].cur = space[r].cur;

          ??? ?? space[r].cur = i;

          ??? ?? r=i;

          ??? }

          ??? else{

          ????? space[p].cur =space[k].cur;

          ????? Free_SL(space,k);

          ????? if(r==k)

          ????? r=p;

          ??? }

          }

          }

          posted @ 2006-06-16 01:06 liulang 閱讀(1256) | 評論 (0)編輯 收藏

          線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu) :

          鏈?zhǔn)酱鎯Ρ硎?/span> :

          typedef struct LNode{

          ?

          ? ElemType ? data;

          ? Struct LNode *next;

          ?

          }LNode,*LinkList;

          基本操作在鏈表上的實(shí)現(xiàn) :

          (1) ?? 單鏈表的取元素算法(經(jīng)典

          Status GetElem_L(LinkList L, int i,ElemType &e)

          {

          ?

          p=L->next; j=1;

          while(p && j<i)

          {

          ????? p=p->next;++j;

          }

          if(!p || j>i) return ERROR;

          e=p->data;

          return OK;

          ?

          }

          算法分析 :

          基本操作是 : 比較 j I, 并把指針后移 , 循環(huán)體執(zhí)行的次數(shù) , 與被查元素的位置有關(guān) . 假設(shè)表長為 n, 如果 1<=i<=n, 那么循環(huán)體中語句的執(zhí)行次數(shù)為 i-1. 否則次數(shù)為 n 所以時間復(fù)雜度為 O(n).

          ?

          ? (2) ?? 插入元素算法

          Status ListInsert_L(LinkList &L, int i,ElemType e)

          {

          ?

          ?? p=L;j=0;

          ?? while(p&&j<i-1)

          ????? { p=p->next;++j}

          ?? if(!p || j>i-1)

          ????? return ERROR;

          ?

          ?? s = (LinkList)malloc(sizeof(LNode));

          ?? s->data = e;

          ?? s->next = p->next;

          ?? p->next =s;

          ?? return OK;

          }
          (3) ?? 刪除元素算法

          Status ListDelete_L(LinkList &L, int i,ElemType &e)

          {

          ?? p=L;j=0;

          while(p &&j<i-1)

          ?? {p=p->next;++j}

          if(!p ||j>i-1)

          ????? return? ERROR;

          ??

          q=p->next;

          ?? p->next =q->next;

          ?? e =q->data;

          ?? free(q);

          ?? return OK;

          }

          ?

          算法分析 :

          插入和刪除算法 , 都要先找到第 i-1 個節(jié)點(diǎn) , 所以時間復(fù)雜度為 O(n);

          ? (4) ?? 單鏈表的建立算法

          ?

          void CreateList_L(LinkList &L,int n){

          ?

          ?L =(LinkList)malloc(sizeof(LNode));

          ?

          ?L->next = null;

          ? for(i = n;i>0;--i){

          ?

          ? p =(LinkList)malloc(sizeof(LNode));

          ? scanf(&p->data);

          ? p->next = L->next;

          ? L->next =p;

          ? }

          ?

          }

          算法分析 :

          按照逆序循環(huán)輸入 n 個數(shù)據(jù)元素的值 , 建立新節(jié)點(diǎn) . 并插入 . 因此算法的時間復(fù)雜度為 O(n).


          posted @ 2006-06-16 01:04 liulang 閱讀(957) | 評論 (3)編輯 收藏
          主站蜘蛛池模板: 克东县| 屯留县| 东乌| 惠州市| 洪雅县| 洪洞县| 江陵县| 长宁区| 武胜县| 海兴县| 宜黄县| 延津县| 吉安县| 仙桃市| 曲水县| 同仁县| 香河县| 石嘴山市| 鹿邑县| 花垣县| 长春市| 达拉特旗| 齐齐哈尔市| 台南县| 惠来县| 大洼县| 吐鲁番市| 兴山县| 文化| 贵溪市| 昂仁县| 清河县| 古蔺县| 邯郸县| 将乐县| 来凤县| 慈利县| 祥云县| 乌什县| 府谷县| 都江堰市|