
2006年6月9日
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ù)定的房間列表,因為99號房間,已經(jīng)被事務(wù)1預(yù)訂。所以不在列表中。
事務(wù)1:信用卡付款。由于付款失敗,導(dǎo)致整個事務(wù)回滾。
所以插入到Reservation 表中的記錄并不置為持久(即它將被刪除)。
現(xiàn)在99號房間則為可用。
所以,事務(wù)2所用的是一個無效的房間列表,因為99號房間,已經(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ǔ)。因為允許出現(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剛插入的行。這個行被稱為幻象,
因為對事務(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 閱讀(7331) |
評論 (0) |
編輯 收藏
clob = rs.getClob(fieldName);
String rtn=clob.getSubString((long)1,(int)clob.length());
posted @
2009-04-08 12:17 liulang 閱讀(3195) |
評論 (3) |
編輯 收藏
在resin3.0中,deploy是默認(rèn)的發(fā)布目錄,在MyEclipse中直接發(fā)布到resin的deploy目錄中,起動服務(wù)器就會運行發(fā)布的項目,而在resin-3.1.1中發(fā)布到deploy目錄下的項目不回運行,需要修改conf目錄下的resin.conf文件,用editplus等文本編輯器打開,大概在229行左右,有一行 <web-app-deploy path="webapps"/>是建產(chǎn)發(fā)布目錄路徑的,我們在后邊加上一行 <web-app-deploy path="deploy"/>,這樣在deploy目錄下的項目就能正常運行了。
posted @
2009-04-07 10:22 liulang 閱讀(694) |
評論 (0) |
編輯 收藏
摘要: java折半查找算法
閱讀全文
posted @
2007-09-06 18:02 liulang 閱讀(5227) |
評論 (4) |
編輯 收藏
摘要: 這是面試的時候,最后一道算法題, 可能不習(xí)慣手寫代碼, 做錯了,太沒面子了...
回來一上機就寫出來了!
閱讀全文
posted @
2007-09-05 17:04 liulang 閱讀(6501) |
評論 (5) |
編輯 收藏
摘要: 面試?yán)峡歼@個,都背熟了
閱讀全文
posted @
2007-09-05 16:58 liulang 閱讀(94834) |
評論 (32) |
編輯 收藏
摘要:
閱讀全文
posted @
2006-10-04 06:47 liulang 閱讀(594) |
評論 (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é)點
.
這種結(jié)構(gòu)仍然需要預(yù)先分配一個較大的空間
.
但在插入和刪除的時候
,
不需要移動元素
.
僅需要修改指針
.
所以仍然具有鏈?zhǔn)酱鎯Y(jié)構(gòu)的主要優(yōu)點
.
?
基本操作
:
(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é)點下標(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é)點回收到備用鏈表
.
void Free_SL(SLinkList &space,int k)
{
space[k].cur =space[0].cur;
space[0].cur = k;
}
(4)
??
計算集合運算
(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 閱讀(1253) |
評論 (0) |
編輯 收藏
線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)
:
鏈?zhǔn)酱鎯Ρ硎?/span>
:
typedef struct LNode{
?
?
ElemType
? data;
?
Struct LNode *next;
?
}LNode,*LinkList;
基本操作在鏈表上的實現(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é)點
,
所以時間復(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é)點
.
并插入
.
因此算法的時間復(fù)雜度為
O(n).
posted @
2006-06-16 01:04 liulang 閱讀(952) |
評論 (3) |
編輯 收藏
線性表 :
是 n(n>=0) 個相同特性數(shù)據(jù)元素的有序序列 .
? 順序存儲結(jié)構(gòu)和實現(xiàn)
線性表的順序存儲結(jié)構(gòu) , 可以隨機存取 . 邏輯上相鄰的兩個元素 , 在物理存儲上也是相鄰的 . 順序存儲表示 :
( 見源代碼 ) 基本操作在順序表上的實現(xiàn)
( 見源代碼 )
四大基本操作 :
(1) ?? 構(gòu)造一個空的線性表
( 簡單 )
(2) ?? 順序表的插入算法 .
算法分析 :
時間主要耗費在移動元素上 , 與問題的規(guī)模 (N) 和你插入元素的具體位置有關(guān) , 即插入元素位置越靠近 , 位序 1, 消耗的時間也就越多 . 設(shè)在位序 i 插入元素的概率位 pi=1/(n+1), 移動元素的個數(shù)為 ,(n-i+1):
????? 那么在長度為 n 的順序表中 , 插入一個元素 , 所需移動元素的期望值為 :
????? E = ∑ P i*(n-i+1)???? (i=1,2,3,..,n+1)
????? ?=n/2;
平均移動表中的一半元素 . 時間復(fù)雜度 O( n )
(3) ?? 順序表的刪除算法 .
算法分析 :
同上 , E = ∑ q i*(n-i)???? (i=1,2,3,..,n+1) qi=1/n
????? ? =(n-1)/2;
時間復(fù)雜度為 O (n);
(4) ?? 定位算法 .
算法分析 :
基本操作是進(jìn)行兩個元素之間的比較 , 假設(shè)存在該元素為 a i( 1 ≤ i ≤ n), 則比較的次數(shù)為 i, 否則為 n, 所以算法時間復(fù)雜度為 O(n); 順序存儲結(jié)構(gòu)的性能小結(jié) :
優(yōu)點 :
(1) ?? 可以隨機存取 , 順序表中的數(shù)據(jù)元素 .
(2) ?? 存儲空間連續(xù) , 不必要增加額外的存儲空間 . 比如如果你以鏈?zhǔn)浇Y(jié)構(gòu)存儲 , 那么你就不得不增加一個指針域 .
缺點 :
(1) 插入和刪除一個元素 , 需要移動大量元素 , 耗費時間 .
(2) 初始化順序表的時候 , 要預(yù)先分配一個最大空間 . 有時候會使存儲空間得不到充分利用 .
(3) 容量難以擴充 .
posted @
2006-06-15 17:25 liulang 閱讀(1515) |
評論 (0) |
編輯 收藏
摘要: java集合類總結(jié)
閱讀全文
posted @
2006-06-09 00:16 liulang 閱讀(21014) |
評論 (2) |
編輯 收藏