帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n-
1个…然后继续下去。假如n个词在词典中出现,那么从n+1位置继续找下去,知道句子结束。

import re def PreProcess(sentence,edcode=“utf-8”): sentence =
sentence.decode(edcode) sentence=re.sub(u"[。,,!……!《》<>/“'::?/?、/|“”‘’;]”,"
“,sentence) return sentence def FMM(sentence,diction,result = [],maxwordLength
= 4,edcode=“utf-8”): i = 0 sentence = PreProcess(sentence,edcode) length =
len(sentence) while i < length: # find the ascii word tempi=i
tok=sentence[i:i+1] while re.search(”[0-9A-Za-z/-/+#@_/.]{1}“,tok)<>None: i=
i+1 tok=sentence[i:i+1] if i-tempi>0:
result.append(sentence[tempi:i].lower().encode(edcode)) # find chinese word
left = len(sentence[i:]) if left == 1: “”“go to 4 step over the FMM””"
“”“should we add the last one? Yes, if not blank”“” if sentence[i:] <> " “:
result.append(sentence[i:].encode(edcode)) return result m =
min(left,maxwordLength) for j in xrange(m,0,-1): leftword =
sentence[i:j+i].encode(edcode) # print leftword.decode(edcode) if
LookUp(leftword,diction): # find the left word in dictionary # it’s the right
one i = j+i result.append(leftword) break elif j == 1: “”“only one word, add
into result, if not blank””" if leftword.decode(edcode) <> " ":
result.append(leftword) i = i+1 else: continue return result def
LookUp(word,dictionary): if dictionary.has_key(word): return True return False
def ConvertGBKtoUTF(sentence): return sentence.decode(‘gbk’).encode(‘utf-8’)

测试代码:

dictions = {} dictions[“ab”] = 1 dictions[“cd”] = 2 dictions[“abc”] = 1
dictions[“ss”] = 1 dictions[ConvertGBKtoUTF(“好的”)] = 1
dictions[ConvertGBKtoUTF(“真的”)] = 1 sentence = “asdfa好的是这样吗vasdiw呀真的daf dasfiw
asid是吗?” s = FMM(ConvertGBKtoUTF(sentence),dictions) for i in s: print
i.decode(“utf-8”)

文本测试代码:

test = open(“test.txt”,“r”) for line in test: s =
FMM(CovertGBKtoUTF(line),dictions) for i in s: print i.decode(“utf-8”)

牛mm细心给我讲了一个小时,终于明白它的含义,然后花了一两节分布式数据库的课实现了。当时牛mm还说不可能这么快实现,结果不可能事还是发生了。发现python
果真非常好用。不明白此算法可以看这篇blog
http://blog.csdn.net/NirvanaFeng/archive/2009/05/12/4171799.aspx

初始化方法:

def InitDicForViterbi(nodes,posw,posdi,n): newWordList = [] # 解决未登录词 for i in
nodes: if not posw.has_key(i): newWordList.append(i) maxPosList =
NPos(posdi,n) print maxPosList
GenerateDicPos(newWordList,maxPosList,posw,posdi) def
InitViterbi(node,posw,posdi): viStatePath = [] for i in posw[node]: if i <>
“@@@”: print “i:”,i viStatePath.append([posw[node][i]*posdi[i][“@@@”],[i]])
return viStatePath

viterbi算法函数

“”" nodes 就是分好的词, posw 是词转换为词性的概率,posdi是词性之间的转换概率,n 是n个最大的词性将此用于未登录词中,
weightNone是未出现的词性转移的概率 nodes format {word1,word2…} , posw format
{word1:{pos1:fre,pos2:fre,…“@@@”:totalnum},…“@@@”:total} posdi format
{pos1:{pos2:fre,pos3:fre…“@@@”:total},…“@@@”:total} “”" def
Viterbi(nodes,posw,posdi,n,weightNone): InitDicForViterbi(nodes,posw,posdi,n)
viStatePath = InitViterbi(nodes[0],posw,posdi) length = len(nodes) currentNode
= 1 while currentNode < length: currentPosList = posw[nodes[currentNode]]
paths = [] # print “vstate:”,viStatePath for k in currentPosList: if k <>
“@@@”: ajk = weightNone heap = [] for j in xrange(len(viStatePath)): # compute
every state j to every state k in ti # temppath = viStatePath[j] # print
“lastpos:”,temppath lastpos = viStatePath[j][1][-1] lastweight =
viStatePath[j][0] lastposList = posdi[lastpos] if lastposList.has_key(k): ajk
=lastposList[k] currentweight = lastweight * ajk * currentPosList[k] # print
“viStatePath:”,viStatePath[j][1] pathNew = [data for data in
viStatePath[j][1]] pathNew.append(k) # print “pathNew:”,pathNew
heappush(heap,[currentweight,pathNew]) # get the max possibility of state k in
ti # print “path:”,path paths.append(nlargest(1,heap)[0]) del viStatePath
viStatePath = paths # print “paths:”,paths currentNode = currentNode + 1 heap
= [] # get the max possibility path for i in viStatePath: heappush(heap,i)
return nlargest(1,heap)

结果打印输出函数:

“”“nodes format {word1,word2,…} path is [weight,[pos1,pos2…]]”“” def
Result(nodes,path,edcode=“utf-8”): realPath = path[0][1]
ResultPrint(nodes,realPath,edcode) “”“nodes format {word1,word2,…} path is
[pos1,pos2…]”“” def ResultPrint(nodes,path,edcode=“utf-8”): for i in
xrange(len(nodes)): print nodes[i].decode(edcode),“/”,path[i].decode(edcode)

下面是测试代码:

aa = ConvertGBKtoUTF(“球球”) bb = ConvertGBKtoUTF(“娃娃”) cc =
ConvertGBKtoUTF(“吃饭”) dd = ConvertGBKtoUTF(“好”) ee =
ConvertGBKtoUTF(“dddwieoewkem”) dictions =
{aa:{bb:1,“@@@”:4},bb:{cc:2,aa:3,“@@@”:40},“@@@”:400} posdi = {“n”:{“s”:3,“v”:
3,“@@@”:40},“s”:{“v”:2,“e”:3,“@@@”:33},“v”:{“@@@”:1},“@@@”:100} posw = {aa:{“n
“:1,“v”:3,”@@@”:29},bb:{“n”:1,“s”:1,“@@@”:19},cc:{“n”:1,“@@@”:1},“@@@”:10002}
nodes = [aa,bb,cc,ee,dd,bb,aa,cc] path = Viterbi(nodes,posw,posdi,3,0.01)
print path Result(nodes,path)

这里不要问为啥要encode,然后再decode 因为只有这样才能在屏幕上打印出中文。

前几天去北大软件学院…那里果真是能体会到什么是中国的地大物博,地广人稀。一眼望去好多树呀。来来回回跑的都是车…没有人。不过一个软件学院就一百来人占这么
大块地方很不错了(剩下的两百多人都不知道去哪里了)。中科院软件所几千号人占丁点大的地方,人均土地还是北大多些。

这里感谢下菲菲和亚红,虽然软件学院没有啥好看的,看两位ppmm也不错。

自愿的被拉去听课(语义矛盾),北大请rational的总经理讲云计算。总结一句话:云计算就是一种在云里飘的计算。——这是我给的定义。云计算要关注的是安全。另
外我个人认为因为中国或者其他企业的文化,这种计算环境推行起来还是比较困难。有一个家伙问的问题很好,让我引申到另一个层面。大公司要做云计算,要卖钱。为啥不做一
种通用的技术,比如,我公司过去有这么多机器,这些机器如果有某种技术可以合并在一起。为啥偏偏要买你云计算的服务?所以我准备研究“海计算”…海纳百川~~~

胡扯中…

另外辛苦菲菲和亚红带我在软件学院中跑来跑去…下次还有机会继续带好吃的过去。

这里提供比较简单的方法。如果需要复杂配置,可以找本Oracle的书籍来看。

导出数据(整个数据库)

使用exp system/xxx@fengDB

这里exp是在windows 命令行中输入的命令。system是某个用户。xxx是system的密码,fengDB是你要导出的那个数据库。然后系统会询问你缓
冲区大小,你可以设置4096。下面提示你输入导出的文件名。你可以写d:/data.dmp。然后导出整个表,输入E,导出权限还是啥的输入yes 或者
no.这里只对导出数据那里必须输入yes.其他的自己看情况选择。

导入数据。如果你的Oracle数据库中尚没有fengDB,那么你可以新建立一个名为fengDB的数据库。在Database configuration
assistant中建立一个叫做fengDB的数据库。创建数据库类型需要选择new
database。当然看自己情况需要了。如果你导出的数据本来来自于dataware house这里就要建dataware house.

建好之后,在命令行下输入:imp system/xxx@fengDB
file=d:/data.dmp fromuser=system touser=system这里imp是导入命令,system是你要导入fengDB数据库的
帐号(和上面的fengDB不在同一个PC上。总不会有人导出数据库后导入相同的数据吧?不过如果是更改过过去的数据库然后想导入也可以)xxx是system的密码
,
file就是刚才导出的file.fromuser是data.dmp中的某个权限用户,touser是现在fengDB中的某个权限用户。你也可以使用fully
= y

传说一般是由于防火墙问题造成的。最简单的方法是关闭防火墙。

解决方案如下:

Oracle在windows平台下使用的是Socket专用模式。要改为共享模式才行。

首先到你的远程数据所在的机器下

在运行处regedit

找到HKEY_LOCAL_MACHINE—>SOFTWARE—>ORACLE—>HOME0

添加一个字符串USE_SHARED_SOCKET 值为TRUE

然后去控制面板,例外处,添加一个例外端口:1521(这里的例外端口可以在你的Oracle Enterprise Manager
Console中点击数据库名,看看右边的port,就是那个值)

然后去你的Oracle安装目录,找一个类似init.ora的文件。这个文件可能有很多,找到你的数据库名所在的目录下的文件例如我的数据库名叫chicoDB,那
么找到oracle/admin/chicoDB下的那几个init.ora文件可能文件后面有一大串数字…在那些文件末尾添加一行

mts_dispatchers=“(address=(protocol=tcp)(host=chico)(port=1521))(dispatchers=1
)”

这里的host是你的主机名。

然后去你的Oracle Enterprise Manager Console关闭chicoDB,然后再启动它即可。

当然你的首要条件是已经建立的public database link, 已经在tnsnames.ora中添加的协议适配器。

如果不知道如何添加,参考我的blog:

http://blog.csdn.net/cctt_1/archive/2009/06/05/4245996.aspx

昨日,见同寝兄弟,遂问道:明日一战,万事备否?

答曰:死即死,生即生,何惧哉?且朝生暮死,一日有余,生死过隙,终为一瞬,何异?

吾道:此乃真丈夫耳,吾应为汝立传,以留后世。

今朝,吾道:今易水一别,恐难再聚,兄弟应饮此水,勿忘家乡父老,他日为异乡之鬼,亦能顺水归根。

说罢,饮之泼水门外,绝尘而去。

吾泣焉:考场如战场,兄弟不磨笔锋,不思对策,不读万卷,终将被师所擒。吾恐豪言终不能救汝性命,遂刻此于碑,拜祭兄弟,以警世人。

Oracle的分布式做的挺不错的,因为你只需要建立几个database link就可得到想要的东西。

如下展示:

首先在Oracle安装目录下找到一个叫做tnsnames.ora的文件。在其中添加一些内容例如:

LOANDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3 )(PORT = 1521 ))
)
(CONNECT_DATA =
(SERVICE_NAME = LOANDB )
)
)

其中HOST = 192.168.1.3是你要连接的远程数据所在的ip地址。PORT = 1521是这个远程数据库的监听端口。SERVICE_NAME =
LOANDB是远程的数据库名。

然后使用sqlplus登陆Oracle。

sqlplus

system@chicoDB as sysdba

然后输入你的密码

然后写这样一句话:

create public database link loan connect to system identified by feng
using ’ loanDB ’

这里loan是你的连接名,以后就可以直接使用这个名字作为远端了。system是远程数据库的用户名。feng是那个用户名的密码。loanDB看上面的tnsna
mes.ora中的那一行LOANDB就是.

然后你要查询远程数据的中的system.client表就这样写一行:

select * from system.client@ loan 就可以了。

如果你不小心把database link建错了,只需要drop public database link loan即可。

远程的更新稍稍有些问题。就是可能你看到不到数据库已经更新了。或者你这边看到更新了,但是远程的数据库好像并没有更新。这种问题的解决方案就是:在update或者
delete语句之后使用commit;语句即可

Oracle事务处理用C#代码这样写:(我使用的ODBC)

public Boolean ExecuteTransaction(string[] sqls)
{
const string connectionString = “DSN=fengDB;UID=System;Pwd=zaqwsx;”;
using (OdbcConnection connection =
new OdbcConnection(connectionString))
{
OdbcCommand command = new OdbcCommand();
OdbcTransaction transaction = null;

// Set the Connection to the new OdbcConnection.
command.Connection = connection;

// Open the connection and execute the transaction.
try
{
connection.Open();

// Start a local transaction
transaction = connection.BeginTransaction();

// Assign transaction object for a pending local transaction.
command.Connection = connection;
command.Transaction = transaction;
foreach (string sql in sqls)
{
System.Console.WriteLine(sql);
command.CommandText = sql;
command.ExecuteNonQuery();
}
// Execute the commands.

//command.CommandText =
//    “Insert into Region (RegionID, RegionDescription) VALUES (101,
‘Description’)”;
//command.ExecuteNonQuery();

// Commit the transaction.
transaction.Commit();
Console.WriteLine(“Both records are written to database.”);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
try
{
// Attempt to roll back the transaction.
transaction.Rollback();
}
catch
{
// Do nothing here; transaction is not active.
}
return false;
}
// The connection is automatically closed when the
// code exits the using block.

}
return true;
}
加红的地方好像必须这样写,不管你前面是否已经建立了连接。不过有一点不好的是,这样的事务处理只能批处理更新和删除…只能根据业务需求再重写这些。

转自 NirvanaFeng 发表

tag:DDB,分布式数据库,复习要点

【第一次自己总结,又想起大学考政治的时候为大家总结要点的同学们,辛苦辛苦…如今我已经自力更生了,哈哈】

第一章

1、 分布式数据库的定义( P4 )

物理上分散而逻辑上集中的系统,它使用计算机网络将地理位置分散而管理和控制又需要不同程度集中的多个逻辑单位(通常是集中式数据库系统)连接起来,共同组成一个统一
的数据库系统。分布式数据库系统可以看成是计算机网络和数据库系统的有机结合。

2、 分布式数据库的两种分类方法( P7 )

l 按 局部 DBMS 的数据模型 分

同构型 DDBS :各个站点上数据库使用同一数据模型

同构同质型 - 数据模型相同,且是同一种 DBMS (同一厂家)

同构异质型 - 数据模型相同,不是同一种 DBMS

异构型 DDBS :各站点上数据库的数据模型类型不同

l 按 DDBS 的全局控制类型 分

全局控制集中型 DDBS :全局控制机制和全局数据词典位于中心站点

全局控制分散型 DDBS :全局控制机制和全局数据词典分散在网络的各个站点上。

全局控制可变型 DDBS :也称主从型 DDBS 。分成两组站点,一组包含全局控制机制和全局控制词典,另外一组不包含。

3 、分布式数据库的组成成分(两部分) ( P9 )

l 数据 :分布式数据库的主体,包括局部数据和全局数据。

l 数据目录 :数据结构的定义、全局数据的分片、分布、授权、事务恢复等描述,包括局部和全局数据目录。

** 4、 ** 分布式数据库的数据分片的定义和类型( 3 种)( P10 )

数据分片:又称 数据分割 、数据分段,局部数据库是由全局数据库分割而成。

三种类型:

l 水平分片:按特定条件把全局关系的所有元组划分成若干个互不相交的子集,对全局关系施加选择运算。

l 垂直分片:把全局关系的属性集分成若干个子集,对全局关系施加投影运算。

l 混合分片:以上两种方法的混合。

** 5、 ** 分布式数据库的分布策略( 4 条)( P11 )

数据分布:根据某种策略把数据分片所得的逻辑片断分散地存储在各个站点上 .

l 集中式:所有数据都安排在同一站点上

l 分割式:所有数据只有一份,被分割成若干个逻辑片段,每个片段被放置在特定的站点

l 复制式:所有数据有多个副本,每个站点都有一个完整的数据副本

l 混合式:分割式和复制式的混合

** 6、 ** 分布式数据库的模式结构( P13 )

分四层:

l 全局外层: _ 全局外模式 _ -– 全局应用的用户视图。

l 全局概念层: _ 全局概念模式 _ -– 描述全局数据的逻辑结构和数据特性; _ 分片模式 _ -– 描述全局数据的逻辑划分; _
分配模式 _ -– 根据数据分布策略,定义各片段的物理存放站点。

l 局部概念层: _ 局部概念模式 _ -– 各个站点上全部物理映像的集合。

l 局部内层: _ 局部内模式 _ -– 全局 / 本站点数据在本站点的存储描述。

** 7、 ** 分布式数据库的功能模块( P.16-17 )

l 查询处理模块:任务是减少查询处理的代价

l 完整性处理模块:负责维护数据库的完整性和一致性

l 调度处理模块:发布局部处理命令,管理数据传输

l 可靠性处理模块:负责监视系统的各个部分是否有故障出现。


** 8、 ** 分布透明性的层次(三层 P.25-26 )

分布透明性也叫分布独立性,包括三个层次:

l 分片透明性 :用户编写应用程序只对全局关系进行操作,不必考虑数据的逻辑分片。

l 位置透明性 :也叫分配透明性。用户编写应用程序需要了解数据分片情况,但不必了解副本和各片段的站点位置情况。

l 局部数据模型透明性 :不必了解站点上数据库的数据模型及其数据对象的表示性质。

第二章 DDB 设计

1 、 DDB 设计的两个方法 P39-40

l 自顶向下:(对应于 DDB 创建方法中的重构法)从头开始设计分布式数据库
。根据系统的实现环境和用户需求,按照分布式数据库系统的设计思想和方法,采用统一的观点,从总体设计做起,包括各站点上的数据库系统,重新建立一个 DDBS
。可以有效解决数据一致性、完整性和可靠性问题。通常是同构异质或者同构同质的。

l 自底向上:(对应于 DDB 创建方法中的组合法)通过聚集现存数据库来设计分布式数据库
。利用现有的计算机网络和独立存在于各个站点上的现存数据库系统,通过建立一个分布式协调管理系统,将它们集成为一个统一的 DDBS
。通常是异构或者同构异质。

2、 DATAID-D 方法 P52

这是自顶向下设计分布式数据库的一个典型方法,增加的两个阶段:

l 分布要求分析阶段

输入:用户分布要求、全局数据概念模型、全局数据操作模式;

输出:频率表(各个站点每一应用激活次数)、划分表(各实体的潜在水平分片规则)、极化表(由一个站点发出的一给定应用访问一给定片段的频率)。

l 分布设计阶段

– 分片设计:对实体进行水平分片和垂直分片。

– 非冗余分配:利用最佳适应法,把各片段映射到使用最多的站点上。

– 冗余分配:起初使用非冗余分配,在每次迭代时,计算因增加一副本使其变成本地访问的得益与为维护该副本一致性所需要附加远程修改的损失之差值,如果是个整数,就
把该副本存储到该得益站点。

– 局部模式的重新构造:重新构造片段分配站点上的局部模式。

_ 3 _ _ 、数据片断分配法 _ _ _ _ _ _ P50 _ _ ,同时参见 _ _ PPT _ _ 相关部分 _ _ _

_ 4 _ _ 、 _ _ DATAID _ _ 方法的应用 _ _ P55 _ _ ,同时参见 _ _ PPT _ _ 相关部分 _ _
_

第三章 分布式查询处理和优化

_ 1、 _ _ 关系代数知识,并能进行实例运算,类似习题 _ _ 3.6 _ _ 的运算要了解 _ _ _ _ (重点 _ _ PPT _ _
上例题) _ _ _

_ _

2、 查询树 , 查询变换 , 限定关系等定义

l 查询树
:将一个查询的关系代数表达式进行语法分析得到一颗语法树:叶子节点是查询涉及的关系,各个节点是关系代数操作符,根节点是查询结果。语法树又称查询树。

l 查询变换:从全局查询到片段查询的变换?

l 限定关系 : R:Q R 称为 R 的限定关系,其中 Q R 表示查询。逻辑片段就是一个限定关系。

s city=‘london’ (Supplier) 的限定关系 : [Supplier: s city=‘london’ ]

_ 3、 _ _ 基于关系代数等价变换的查询优化实例(重点看 _ _ P80-82 _ _ ) _ _ _

基本原理:把查询问题转换为关系表达式;关系表达式到查询树(语法树)的变换;全局查询到片段查询的变换(把全局查询树中的全局关系名,用重构该全局关系的各片段名替
换,变换成相应片段上的查询树);利用关系代数等价变换规则的优化算法,尽可能先执行选择和投影操作。

_ 4、 _ _ 基于半连接的算法的查询优化的操作过程和代价估算( _ _ 83-84 _ _ ) _ _ _ _ (重点看 _ _ PPT _
_ 例题) _ _ _

_ _

_ _

_ 5、 _ _ 基于直接连接算法的查询优化处理的四种方法,重点 _ _ 1 _ _ 、 _ _ 2 _ _ 、 _ _ 4 _ _ 算法。
_ _ ( _ _ 重点看书 _ _ P85) _

l 站点依赖 :如果两个关系不同站点的分片在属性 A
上没有交集(说明它们之间连接结果为空,只进行本站点片段连接再合并就够了),则可以只在同一站点上做片段连接操作,然后合并连接结果。

l 分片和复制 :如果不符合站点依赖的条件,则选择一组站点,把查询引用的某个关系的所有片段分布到这些站点上,其余被引用关系则复制到每个选定站点中去,这样
在每个站点进行本地连接,再合并结果,必然会覆盖到所有该连接的元组(因为每一个站点都有另一个关系的完全副本)。

l Hash 划分 :如果两个关系不符合站点依赖的条件,利用 Hash 函数对分片关系上的连接属性作站点依赖计算,再据此分片,比如按连接属性取值为
奇偶数来把元组发送到不同站点,这样分片后两个关系必然就满足站点依赖条件,再进行本地连接。这实际是构造站点依赖的一种方法。

第四章 分布式数据库中的事务管理和恢复

1 、分布式事务的定义和特性 P97

定义:事务是访问数据库的最小逻辑工作单位,它是一个操作序列。分布式事务是一个分布式操作的序列,被操作的数据分布在不同站点上。

ACID 特性:

l 原子性( Atomicity ) : 事务的操作要么全部执行 , 要么全部不执行 , 保证数据库一致性状态。

l 一致性( Consistency ) : 事务的正确性。并发执行的多个事务 ,
其操作的结果应与以某种顺序串行执行这几个事务所得的结果相同。

l 持久性( Durability ) :事务提交后 , 其操作的结果将永久化 , 与提交后发生的故障无关。

l 隔离性( Isolation ): 事务在提交前,决不允许把它对共享数据所作改变的结果提供给其他事务使用。

2 、分布式事务的结构 P99

(一个应用由若干个分布式事务组成,每个分布式事务由不同站点的若干子事务组成)

分布式事务的一般结构 :

Begin Transaction 原语:开始一个事务

T1[]

T2[]
子事务或操作序列

:

Tn[]

Commit 原语:事务成功完成的结束

Rollback 或 Abort 原语:事务失败的结束

3、 分布式事务执行的控制模型(三种) P105

分布式事务控制模型是指协调分布式事务中各成员 DBMS 执行其子事务的通用方法,有三种 :

l 主从模型:分布式事务管理器作为主控制器,局部事务管理器( LTM )作为从属控制器, LTM 之间无通信。

l 三角模型:控制权是分布式事务管理器和 LTM 之间分享的。 LTM 之间可以传递数据,避免了主从之间不必要的传输。

l 层次控制模型: LTM 还可再创建 Agent ,控制其它 LTM 执行,比前两种复杂。

4 、事务恢复的概念 P108

当发生故障时,保证事务原子性的措施称为事务故障恢复,简称事务恢复,主要依靠日志来实现。

5 、事务的状态和状态转移 P109

事务在执行过程中的状态变化:事务开始后立即进入活动状态,可以进行读写操作;事务结束时进入部分提交状态;事务到达提交点时进入提交状态;如果检查出故障或者事务在
活动状态期间被撤销,则进入故障状态;终止状态表明事务已经离开系统。

6 、本地事务恢复的过程( P.112 )

本地事务恢复的过程类似于集中式数据库系统中事务的恢复:

1) 从“重启动文件” 读出最近 Checkpoint 的地址 , 定出 Checkpoint 在 Log 文件中的位置。 _
(找最近的检查点) _

2) 创建 Redo 表(初态为空);创建 Undo 表 ( 即 Checkpoint Record 中的活动事务表 ) 。

3) 从 Checkpoint Record 起沿 log 向前检索,遇到 begin transaction 的 log
记录,其对应的事务记入 Undo 表;遇到 commit 的 log 记录,其对应事务从 UNDO 表移入 Redo 表,直至 log
完。 _ (在 _ _ Undo _ _ 表和 _ _ Redo _ _ 表中加响应的事务) _

_ 4) _ 反向检索 Log, 将 Undo 表中事务 , 按 log 记录的操作,做 Undo ,直到遇到对应的 Begin
Transaction 。 _ (执行 _ _ Undo _ _ ) _ _ _

_ 5) _ 从 Checkpoint Record 起正向检索 Redo 表中事务的 Log 记录 , 并执行之 , 直到对应的
Commit 记录。 _ (执行 _ _ Redo _ _ ) _ _ _

7 、两阶段提交协议定义和原则( P115-116 )

将本地原子性提交行为的效果扩展到分布式事务 ,
保证了分布式事务提交的原子性。基本思想是:坚持在分布式事务结果生效之前,所有参与执行分布式事务的站点都同意提交。 _ ( _ _ 2PC _ _
把提交过程分为两个阶段:表决阶段 _ _ — _ _ 目的是形成共同的决定;执行阶段 _ _ — _ _ 目的是实现这个决定。) _

全局提交规则:

l 只要至少有一个参与者撤销事务,协调者就必须做出全局撤销的决定;

l 只有所有参与者都同意提交事务,协调者才能做出全局提交的决定。

8 、两阶段提交协议的通信结构( P117 ,还是把 ppt 上图看一下)

• 集中式:通信只发生在协调者和参与者之间,参与者之间不交换信息

• 分层式:协调者是在树根的 DTM 代理者,协调者与参与者之间的通信不使用直接广播,而是使用报文在树中上下传播。 _ 每个 _ _ DTM _ _
代理是通信树的一个内部节点,它从下层节点处收集报文或向它们广播报文。 _ _ _

• 线性:参与者之间可以互相通信。系统中的站点间要排序,消息串行传递。

• 分布式:允许所有参与者在第一阶段相互通信,从而可以独立做出事务终止决定。

9 、主文本更新法

分布式数据库中数据更新方法之一。

指定一个副本为主文本 , 更新时只对主文本进行;然后由主文本站点将主文本更新内容及时发送到各辅文本站点,各辅文本的更新可以并行进行。

问题 _ -- _ _ 更新传播必须在短时间内完成 _ _ , _ _ 否则将获得“过时”数据;主文本不可用 _ _ , _ _
将引起其它辅文本也不可用。改进方法 _ _ -- _ _ 移动主文本法。 _ _ _

第五章 分布式数据库中的并发控制

1 、并发控制的定义 P131

并发控制就是负责正确协调并发事务的执行,保证并发存取操作不至于破坏数据库的完整性和一致性,确保并发执行的多个事务能够正确地运行并获得正确的结果。

2 、串行调度、可串行化调度和一致性调度的定义 P133

• 串行调度:若一个调度 S ,其每个事务的执行均有 Ti<Tj ,即事务 Ti 的所有操作都先于事务 Tj 的操作,
每个事务相继执行,这样的调度 S 为称串行调度。

• 可串行化调度:如果一个调度等价于某个串行调度,则该调度称为可串行化调度。

• 一致性调度:执行一个调度可以使得数据库从一个一致性状态转变为另一个一致性状态,则称调度为一致性调度。

• 事务的可串行性:若干个事务并发执行的结果与按希望那个的顺序执行的结果相同时,称诸事务是可串行的。

3 、并发控制算法的分类 P140

并发控制机制分为两种类型:悲观算法和乐观算法。悲观算法使事务的并发执行在执行生命周期的开始就同步化,而乐观算法将同步化延迟到事务执行周期的结束。

4 、基于封锁的并发控制算法 P141

基本思想:事务访问数据项之前要对该数据项加锁,如果已经被其他事务加锁,就要等待,直到那个事务释放该锁为止。

5 、封锁粒度、锁的类型 P141

锁的粒度 :锁定数据项的范围。锁粒度小,并发度高,锁开销大。

包括以下几个层次:

• 数据库记录中的一个字段值

• 一条数据库记录

• 一个磁盘块(页面)

• 一个完整的文件

• 整个数据库

锁的类型 :

– 共享锁: Share 锁, S 锁或者读锁

– 排它锁: eXclusive 锁, X 锁,拒绝锁或写锁

– 更新锁: Update 锁, U 锁

6 、两阶段封锁协议 P147

一个事务所有的封锁操作(读写)都在第一个解锁操作之前,则该事务遵守两阶段封锁协议。这样一个事务可以被分成两个阶段:

l 上升阶段 ( 成长阶段 ) :只能获取新锁,而不能释放已有的锁

l 收缩阶段 ( 衰退阶段):只能释放已有的锁,而不能获得新锁

_ 保守 _ _ 2PL _ _ :要求事务在开始执行之前就持有所有它要访问的数据项上的锁。 _ _ _

_ 严格 _ _ 2PL _ _ :事务提交或撤销之前,绝对不释放任何一个写锁;在事务结束时,同时释放所有的锁。 _ _ _

_ 严酷 _ _ 2PL _ _ :事务在提交或撤销之前,不能释放任何一个锁。 _ _ _

7 、多粒度锁、意向锁的定义和锁的相容性 P153

多粒度锁:封锁的粒度不是单一的一种粒度,而是有多种粒度

意向锁:如果对一个节点加意向锁,则说明该节点的下层节点正在被封锁;对任一节点封锁时,必须先对它的上层节点加意向锁。包括意向共享锁( IS
)、意向排他锁( IX )以及共享意向排他锁( SIX )三种类型。

锁的相容性:

8 、基于时标的并发控制方法基本概念、基本思想、时标分配方法 P163

基本概念:不通过互斥来支持串行性,而是通过在事务启动时赋给时标(时间戳)来实现;时标是用来唯一识别每个事务并允许排序的标识;如果 ts(T1) <
ts(T2) … < ts(Tn), 则调度器产生的序是 : T1,T2, … Tn 。

基本思想:每个事务赋一个唯一的时标,事务的执行等效于按时标次序串行执行。如果发生冲突,是通过撤销并重新启动一个事务来解决的。事务重新启动时,则赋予新的时标。
优点是没有死锁,不必设置锁。

时标分配方法:

– 全局时标:使用全局的单调递增的计数器

– 局部时标: < 本地计数器值,站点标识符 > 。每个站点基于其本地计数器自治地指定一个时标,同时附加上其自身的站点标识符。

9 、多版本法的基本概念 P166

并发控制的多版本技术。

多版本并发控制协议:维护了一个数据项的多个版本值。思想是:通过读取数据项的较老版本来维护可串行性,使得系统可以接受在其他技术中被拒绝的一些读操作。

10 、多版本 2PL 的基本思想 P167

当一个事务 T 持有数据项 X 的写锁时,其他事务 T’ 依旧可以读 X 。通过 X
的两个版本实现这样的功能:一个版本是最近已提交版本;另外一个 X’ 是事务 T 获得该项上写锁时创建的新版本。其它事务可以继续读 X
的已提交版本,而事务 T 可以根据需要更新 X’ 的值。在 T 提交之前需要获得 X 的验证锁,一旦获得验证锁,老版本改为最新版本。

第六章 分布式数据库中的可靠性

1 、可靠性和可用性的概念及其两者的关系 P173

可靠性:数据库在一给定时间间隔内不产生任何失败的概率。强调数据库的正确性。

可用性:给定的时间 t ,数据库可以正常运行的概率。强调的是当需要访问数据库时,它是可用的。

两者关系:

– 通常认为构建可用性系统比可靠性系统容易

– 两者是统一的,可靠性高的系统可用性自然好

– 两者又是矛盾的,增加错误风险的情况下,可提高可用性;采用太谨慎的策略会降低可用性。

2 、 MTTD 、 MTBF 、 MTTR 三者的定义,及其图示 P178

l 平均检测时间 (MTTD) :一个故障在它发生一段时间后才被检测出,这一段时间叫潜伏期,同种系统的平均故障潜伏时间称为平均故障检测时间。

l 平均修复时间 (MTTR) :修复一个失败的系统所需要的期望时间。

l 平均故障间隔时间 (MTBF) :可以自我修复的系统中相继失败之间的期望时间。

3 、分布式可靠性协议的执行过程 P179

– Begin-Transacrion :登录

– Read : LTM 先在事务处理的缓冲区中读,若不在,则向缓冲区管理器发 Fetch 命令,读出数据后, LTM 将它交给调度程序

– Write :若在 Buffer 中得到,则在那更新,否则对 Buffer Manager 发 Fetch
命令,读出数据并修改,同时数据的前像和修改后的后像写入日志。

– Abort :根据日志做 Undo

– Commit :将事务结束记录写入日志

4 、分布式可靠性协议的组成(三个协议) P180

分布式数据库系统的可靠性协议包括提交协议、终结协议、恢复协议。

– 提交和恢复协议详细说明提交命令和恢复命令是如何执行的

– 终结协议解决一个站点失效时,未失效站点如何处理该失效事件的问题

5 、非阻断协议的充要条件和三阶段提交协议的定义 P187

提交协议是非阻断的充要条件是 , 在其状态转换图中不存在 :

• 没有状态同时与提交状态和撤销状态“相邻”

• 没有不可提交状态与提交状态“相邻”

在 2PC 的等待状态和提交状态之间增加一个状态,作为一个缓冲,用于在准备提交但是还没有提交的时候。因为从初始状态到提交状态之间有三次状态转换,所以称为
三阶段提交协议 。

6 、三阶段提交协议的超时处理 P189

• 协调者

– 在等待状态超时:协调者单方面 Abort

– 在预备提交状态超时:将所有参与者移入预备提交状态

– 在提交 / 撤销状态超时:忽略

• 参与者超时

– 在初始状态超时:与 2PC 中的情况相同

– 在就绪状态超时:终结协议

– 在预备提交状态超时:终结协议

7 、网络分割中基于表决的协议 P192

分为多数表决法和法定人数表决法?

多数表决法的基本思想是:如果大多数站点提议执行某事务,那么该事务就被执行。概括为表决基于法定人数。实现提交协议必须满足的规则:

每个站点 i 有选票数 Vi, 系统总投票数为 V 。

l 事务在提交前,它必须获得提交法定票数 Vc

l 事务在撤销前,它必须获得撤销法定票数 Va

l Va+Vc ≤ V, 当 0 ≤ Va, Vc ≤ V 。

前两条指出事务终结时必须获得的投票数;最后一条保证事务不能同时既被撤销又被提交。

8 、采用版本号检测不一致性 P200

允许对数据项操作的站点的副本是主副本 , 其它是孤立或隔离的副本。正常工作期间 , 全部副本都是主副本 , 并且互相一致 ,
每份副本维持一个原版号和一个当前版本号。初始时原版本号置为 0 ,当前版本号置为 1 ;每当对副本执行一次更新,只是当前版本号加 1
。网络分割时 , 每个孤立副本的原版本号被置为当前版本号值。这样直到分割修复为止 ,
此原版号不会改变。这时比较所有副本的当前版本号和原版本号就能暴露出不一致性。( _ 如果分割修复时,发现分割区域原版本号和未分割区域当前版本号不同且分割区域
原版本号和分割区域当前版本号也不同,则不一致。各个分割区域中当前版本号不同,也可能不一致。) _ _ _

_ _

第七章 分布式数据库的安全性和目录管理

1 、不安全因素的三个方面 P207

-- 数据存储在各个站点上存在的不安全因素

-- 访问各个站点上数据存在的不安全因素

-- 数据在各站点之间传输时存在的不安全因素

2 、安全层次(五个层次) P209

• 物理层:保护数据不受侵入者的物理破坏

• 用户层:防止保密字被盗

• OS 层:从访问系统的口令到并发进程之间隔离,都要提供保护

• 网络层:保证是与可信赖的站点通信 , 保证链路没有被窃听和篡改

• 数据库系统:为不同需求的合法用户授予不同的权限

3、 数据库安全的术语 P211

1) 主体 (Subject) :引起信息流动或改变系统状态的主动实体 , 如用户、 程序、 进程。

2) 客体 (Object) :蕴含或接收信息的被动实体,信息的载体 , 如 DB, 表 , 记录 , 视图 , 属性等。

3) 可信计算基( trusted computing base ):实现安全保护机制的集合体(包含硬件、固件和软件)。

4) 域:主体有能力存取的客体集合

5) 安全级 (Security Level) :主体和客体的访问特权 , 一般主体安全级表示主体对客体敏感信息的操作能力 ,
客体安全级表示客体信息的敏感度

_ 6) _ 敏感度标记:表示客体和主体的安全级的一条信息。 _ 可信计算基使用它来确定是否使用强制访问控制。 _ _ _

7) 最小特权原理:主体在执行授权任务时,应被授予完成该任务所需的最小存取权。

8) 访问监控器:监控主体和客体之间授权访问关系的部件。

9) 信道:系统内的传输信息的通路。

  1. 隐蔽信道 (Covert Channel) :以危害系统安全的隐蔽方式传输信息的通信信道

_ 11) _ 自主访问控制 (Discretionary Access Control)
:基于主体身份或主体所属组的身份或二者结合来限制对客体访问的方法 . _ 具有访问权的主体能自行决定其访问权直接或间接转授给别人。 _ _ _

_ 12) _ 强制访问控制 (Mandatory Access Control)
:基于主体与客体各自所具有的敏感度标记的控制关系来决定主体对客体的访问 . _ 标记是由系统安全员指派 _ _ , _ _ 用户不能随意修改 _
_ , _ _ 更不能转让 _ _ _ _ 。 _ _ _

_ 13) _ 数据库的安全策略 : 根据用户需求、安装环境、建立规则和法律等方面的限制来制定的,用来描述访问规则和访问特征的关系。 _ _

_ 14) _ 形式化安全保护策略模型 _ : _ 安全保护策略的完整精确描述。 _ _

_ 15) _ 安全保护策略模型 _ : _ 安全保护策略的非形式化描述 _ _

4 、面向用户的口令法 P215

面向用户的口令系统是每个用户或每个组用户有一个口令,该口令允许用户只能访问他所需要的数据对象。

5 、多级安全模型的系统状态定义 P217

多级安全 BLP 模型系统状态 v 是集合 V 中的元素, V=(B ´ M ´ F ´ H) : B 为当前存取集 ,
B Í (S ´ O ´ A) ,S 为主体集, O 为客体集 , A 为访问方式集合; M
是存取控制矩阵,每个元素表示主体对客体的访问权限集合; F 为安全级函数; H 为当前客体层次结构。

6 、自主访问控制和强制访问控制

见术语部分

7 、数据库安全评估标准的分类和分级 P227

1991 年美国国家计算机安全中心根据 TCSEC 制订紫皮书《可信计算机系统评估标准的可信 DBMS 说明》, DBMS 的安全分 4
类 ,7 级 , 25 条评估标准:

– D :最低保护

– C : 自主保护类 , 基于主体身份来限制对客体访问。

• C1 级:自主安全 保护

• C2 级:可控存取保护

– B :强制保护类 , 基于主体与客体各自所具有的敏感度标记的控制关系来决定主体对客体的访问

• B1 级:标记安全保护

• B2 级:结构化保护

• B3 级:安全域保护

– A :验证保护类

• A1 级:可验证保护

8 、身份认证的三个级别 P229

系统登录认证: OS 检查

数据库连接 : DBMS 验证

数据库对象使用: DBMS 核实其对数据对象的存取权限

第八章 分布式数据库与 C/S 模式结构

1 、 C/S 模式定义和当前流行的两种模式 P242

C/S 模式系统:某些站点是客户机站点,而另一些站点是服务器站点;所有的数据驻留在服务器站点;所有的应用都在客户机站点运行;一般不提供完全的位置透明性。

当前流行的两种模式:

1 )传统的两层结构 C/S----- 服务器(或服务器群)存储数据,客户机群存取数据,服务器扮演支配角色。

2 )正在涌现的三层 C/S------ 数据层、功能层和表示层:数据层是驻留在主机上的 DBMS
;功能层是应用服务器,负责应用逻辑处理;表示层由客户机实现,是应用的用户接口。

2、 计算环境演变过程中的五个系统 P249

l 主机处理系统:所有程序在一个主机上运行

l 文件处理系统:应用处理 ( 包括数据处理 ) 都发生在 PC 工作站,文件服务器仅从硬盘查询所需要的文件通过网络发送给用户 PC 机。

l C/S 处理系统: Client 通过网络请求服务, Server 提供服务。

l 多处理器服务系统:存在两个或两个以上服务器的 C/S 系统

l 对等处理系统: C/S 系统的最终归宿 , 站点既是客户机又是服务器

3、 数据分布基本形式 P260

复制数据、子集数据、重新组织的数据、分区数据、独立模式数据、不相容数据

4、 分布式数据访问的几种类型 P266

l 远程请求 :只涉及单个远程服务器的单个请求

l 远程事务 :允许一个事务中包含多个数据访问请求,这些请求都引用同一个远程服务器站点上的数据

l 分布式事务 :一个事务包含多个数据请求 , 每个请求只能访问单个服务器,不同请求可以访问不同的远程服务器站点

l 分布式请求 :一个事务包含多个数据请求 , 每个请求都可以引用驻留于多个服务器站点数据

5、 基于 B/S 模式系统的 Microsoft 实现方案

第十章 云计算

1 、云计算的定义(自己总结)

由专业网络公司将存储和计算能力集中起来成为一个虚拟的资源池来为整个网络提供服务,用户通过浏览器就可以很方便的访问,把“云”作为资料存储以及应用服务的中心。“
云”可以计费,用户按需购买。这种模式类似于用电不需要家家装备发电机,直接从电力公司购买一样。

2 、云计算的几种形式(七种)

1 ) SAAS (软件即服务): 通过浏览器把程序传给成千上万的用户

2 )实用计算:为 IT 行业创造虚拟的数据中心,把存储和计算能力集中起来

3 )网络服务:提供 API 让开发者能够开发更多基于互联网的应用

4 )平台即服务:把开发环境作为一种服务来提供

5 ) MSP (管理服务提供商):面向的 IT 管理人员,例如用于电子邮件的病毒扫描服务

6 )商业服务平台 :为用户和提供商之间的互动提供了一个平台

7 )互联网整合 :将互联网上提供类似服务的公司整合起来

3 、当前典型的几个云计算平台( Amazon, Google, IBM, Microsoft)

l Amazon 使用弹性计算云( EC2 )和简单存储服务( S3 )为企业提供计算和存储服务

l Google 推出了谷歌应用软件引擎服务,让开发人员可免费使用谷歌的基础设施来进行托管(最高存储空间达 500MB )

l IBM 提供 “ 蓝云 ” 计算平台,为客户带来即买即用的云计算平台,它包括一系列的自动化、自我管理和自我修复的虚拟化云计算软件

l 微软提供均衡搭配的企业级软件、合作伙伴托管服务以及云服务,即软件加服务

黑客帝国三被誉为是没有含量的片子。不过我倒是不这样想。其实一二三是连成统一整体的。如果一是what do you believe, 二是which is
your choice, 三就应该是just do it. never give up.如果你确定自己是坚信什么也就是自己已经有了做事的原则,然后知道你应该
选择什么,那么第三部就是做你选择的事情,不要轻言放弃。这里是使用不要轻言放弃,还是使用永不放弃呢?这个我不知道应该怎么说。如果每个人都是像阿甘那样对任何一件
事情都持之以恒孜孜不倦的去做,我不知道那人是否会成功。可能会,也可能不会。因为阿甘也并不是什么事情都一直做下去。捕鱼也只是捕到发家,乒乓也只是得到冠军,跑步
也只是全国闻名…告诉我对于一个持之以恒的人来说,这是代表着End还是Start?所以阿甘是急流勇退,见好就收。所以我也不知道是否阿甘已经达到了他的目的。
或者我们做一件事情是否开始就带有目的性,我不得而知。另外我们怎么知道这个目的是正确的还是错误的?例如我想造个永动机。电影毕竟是电影,激励人心,但是很单纯很片
面,却能让人心潮澎湃。或许只有盲目才能让人放手一搏,权衡得失,有时会让人畏缩不前。

如果你已经做出了选择,意味着你必须坚持信念,持之以恒的做下去。人生不过只有两条路,一条是成功,一条就是平庸。反正你有二分之一的几率是成功的,你还怕什么?!

just do it, and never give up! 最后尼奥说:“I won’t fail.”

黑客帝国是部好片,我们不能只看其中打斗场景而忽略了导演想表达的意思。有很多细节或许我们根本看不懂,但是看不懂没有关系,重要的是意思你懂了没有。如同禅语:“字
虽不懂,却懂文中之意。”

选择生还是选择死?有信仰还是没有信仰?是当政客,当商人还是学者?你可以相信我的话,也可以选择不信。

先知和尼奥的一段经典的对话:“来颗糖吧”“你已经知道我的选择了?”“如果我不知道,我就不叫先知”“如果你知道话,我又如何选择?”“你不是来做选择的,你已经做
了选择,你只是来了解,你为何这样选择。”当我们心中有两三个我们可以达成的目标,却不知道那个是最应该达成的。如何选择?我们有很多路可以走,走哪条才是最理想的,
才是最不会让自己后悔的呢?这也就是古人常说的“取舍”。取是一种能力,舍是一种境界。不过舍无关紧要的东西或许简单。舍弃关系到自己生死存亡的利益呢?舍弃自己心中
最想得到的呢?舍弃自己原本的思想呢?舍弃过去的自己呢?好像又不是那么简单。很多时候我们一下决心做出抉择,往往事后又对自己说:“why?”然后反反复复的折磨自
己。

回到原始的问题:“如何抉择?”首先应该询问下自己是否有原则;然后询问下自己是否有所爱;最后询问下自己是否有所得。尼奥是个悲剧,因为他之前选择成为救世主,那他
之后就别无选择。心理学上说:选择具有一致性。如果你第一次选择对;那么第二次如果选择错,心中会很不爽。这也就是我们常说的原则。如果你想做个好人,就不会选择做地
痞流氓的事情。如果你选择高尚,那就先刻好墓志铭。

当然我所说的:首先应该询问下自己是否有原则;然后询问下自己是否有所爱;最后询问下自己是否有所得。这可能是我自己的顺序,可能不是其他的人的顺序。这样选择取决于
性格。大家可以按着这样做,也可以换种顺序。So which is your choice?

0%