楼主: ccwlm741212

[精华] Ms SQL常见问题收集整理集(不断收集中...)

[复制链接]
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
31#
 楼主| 发表于 2003-11-23 13:04 | 只看该作者
数据库应用中并发控制若干实现途径

张在建  

一.引言
并发控制是指在多用户的环境下,对数据库进行并发操作进行规范的机制。其目的是为了避免对数据的丢失修改、读脏数据与不可重复读等,从而保证数据的正确性与一致性。并发控制在多用户的模式下是十分重要的,但这一点经常被一些数据库开发人员忽视,而且因为并发控制的层次和类型非常丰富,有时使人在选择时比较迷惑,不清楚衡量并发控制层次选择的原则和途径。本文将从一个例子入手,结合数据库理论的相关知识,对数据库应用中并发控制的途径、方法做出一个较全面的总结,希望能帮助读者找到合理的并发控制方法。
二.一个并发控制失败的例子
为了更好的理解并发控制的概念,我们先重复一个经常列举的例子。先给出银行数据库中一个经过简化的帐户表(account)信息的数据字典定义,以后我们都将会以此表作为示例。
列名称  列代码  列类型  
帐户号  Id(键值列) Char(10)
户主  Uname Char(10)
存入金额  Mdeposit Currency
支出金额  Mpayout  Currency  
存款余额  Mbalance Currency
这个例子是在客户程序与服务器端数据库的会话过程中产生的:某户主代表在银行前台取款2,000元,银行出纳查询用户的存款信息显示银行存款余额20,000元;正在这时,另一银行帐户转帐支票支付该帐户5,000元,机器查询也得到当前用户存款20,000元,这时银行的出纳员看到用户存款超过了取款额,就支付了客户2,000元并将用户存款改为18,000元,然后银行的另一名操作员根据支票,将汇入的5,000元加上,把用户的余额改为25,000元。很明显银行将会损失2000元,因为另一个出纳员所做的修改被覆盖了。
这是由于对并发操作控制的失败造成的,由于没有对两个并发操作进行合理的隔离,对数据进行合理的锁定,导致经出纳员查询所得到的客户端数据集与数据库的数据出现不一致,结果便产生了丢失修改。
三.数据库并发控制理论基础
在此对并发控制中经常用到的概念略做解释,具体内容请读者查资料。事务是数据库中一个重要概念,它是一系列要么都做,要么都不做的程序集合,是数据库并发控制的单位。事务并发控制不当的话,可以产生丢失修改、读脏数据、不可重复读等数据不一致。但在应用中为了并发度的提高,可以容忍一些这样的不一致,例如大多数业务逻辑经适当的调整以后是可以容忍不可重复读的。当今流行的关系数据库系统(如oracle,sql server等)是通过事务隔离级别(TRANSACTION ISOLATION LEVEL)与封锁机制来定义并发控制所要达到的目标的,根据其提供的协议,我们可以得到几乎任何类型的合理的并发控制方式。例如,Microsoft sql server系统中有四种锁:共享锁,排它锁,意向锁(又分为共享意向锁,排它意向锁,共享意向排它锁),修改锁。各种锁之间有确定的相容关系。有四种事务隔离级别:未提交读、提交读、可重复读、串行化读,不同的隔离级别所规定的封锁协议不同。这一部分内容非常之丰富,足足可以写一本书,篇幅所限,不拟细述,有关内容请查阅数据库理论方面的教材。
封锁类型与隔离级别如此之丰富,那么选择时到底本着一个什么原则呢?那就是数据一致性要求与并发度两个方面。例如四种隔离级别数据一致性依次升高,但并发度依次降低,一般系统默认的隔离级别是提交读。一般来说这可以满足应用的要求了,但这种隔离级别不能避免不可重复读的现象,就是说在你浏览数据库记录的期间,不同时间读的同一条记录可以有不同的内容。有时需要动态的通过sql语句来改变其封锁状态或者隔离级别。
四.并发控制技术的实现途径
并发控制的实现途径有多种,如果DBMS支持的话,当然最好是运用其自身的并发控制能力。如果系统不能提供这样的功能,可以借助开发工具的支持,还可以考虑调整数据库应用程序,而且有的时候可以通过调整工作模式来避开这种会影响效率的并发操作。笔者对各种策略做了一个总结,主要有一下几点:
(一)调整工作模式,修改应用程序,避免不必要的并发。
这在某些情况下是可行的,例如规定录入人员只能修改自己所创造的记录,那么就不会出现并发操作中的各种错误,因为这时各个不同的用户所能更新的记录不会发生重合。这种情况下,需要在数据库表中增加用户列。在用户浏览记录时,将用户列作为一个过滤条件,对应用程序的sql语句做相应的调整。但这种策略的作用有限,因为在大量情况下,并发控制不可避免。
(二)借助于DBMS的功能。
大型关系系统都有比较好的并发控制功能。例如可以采用更新游标、显式加锁、更改事务隔离级别等等。当然在其使用方面有很多注意的技巧,如:(1)事务定义最好不要包含客户交互部分。(2)只有在数据一致性要求特别严格,但并发度要求不高的时候采用可重复读与可串行读的隔离级别。(3)在同一个事务当中,要适当根据需要来变更数据的锁定级别,但一般情况下不要用TABLOCK这样粗粒度的封锁。(4)不同事务之间可以根据并发度的需要来显式设定隔离级别。(5)在包含客户交互的操作中使用游标,并尽可能缩短交互时间。
我们看一个informix数据库中采用更新游标的例子。定义更新游标语法:DECLARE CURSOR-name CURSOR FOR SELECT-statement FOR UPDATE[OF column-list]。更新游标在完成数据的浏览和修改时,要对当前的记录隐式加锁,注意更新游标只对可更新视图有效。为了提高并发度,经常要结合滚动游标来使用,滚动游标定义方法:DECLARE CURSORname SCROLL CURSOR[with hold] FOR SELECTstatement),不过滚动游标不对当前的记录加锁。
下段代码完成客户对帐户内容的浏览和修改,代码采用informix的esql/c(以c语言作为宿主语言)来编写,展示了更新游标的使用方法:
$DECLARE mycurs CURSOR FOR SELECT Mdeposit,Mpayout,Mbalance FROM acount FOR UPDATE; //定义更新游标
$OPEN mycurs; //打开游标
for(;
{$FETCH mycurs INTO $ Mdeposit,$Mpayout,$Mbalance;// 从游标中读记录
if sqlcode=SQLNOTFOUND then exit;//如果记录取完,则退出循环
….//显示记录内容给用户
….//如果用户决定要修改记录,则继续执行
$UPDATE acount SET (Mdeposit,Mpayout,Mbalance)=
($Mdeposit,$Mpayout,$Mbalance) WHERE CURRENT of mycurs;//更新数值
}
带有FOR UPDATE的游标语句有加锁功能。看上面的代码,在进行FETCH操作以后,游标所指向的当前记录被加共享锁,当用户决定要修改时,将该记录上的锁提升为排它锁。那么此时其它用户不可以更新此记录。这种方法有个缺点,就是即使用户不对当前记录进行修改,也要对当前的记录加锁,影响了并发度,那么此时可以采用的一个方法是:(1)定义一个滚动游标来完成查询;(2)获取游标的一个记录,显示给用户;(2)用户浏览记录,直到要修改或者删除的记录;(3)当用户选择修改一个记录时,为用户想要修改的记录定义一个更新游标(4)使用更新游标获取记录,并重新显示锁定的记录;(5)更新这个记录。那么上面的程序就可以更改为:
$DECLARE mycurs SCROLL CURSOR for SELECT Id, Mdeposit,Mpayout,Mbalance FROM acount;//定义滚动游标
$OPEN mycurs//打开滚动游标
for(;
{$FETCH mycurs INTO $Id,$Mdeposit,$Mpayout,$Mbalance; //从游标中读取记录值
if sqlcode=SQLNOTFOUND then exit; //如果读完,退出循环
….//显示记录内容给用户看
….//如果用户决定要修改记录,则继续执行
$DECLARE mycurs_update CURSOR FOR SELECT Mdeposit,Mpayout,Mbalance
FROM Acount WHERE Id=$Id; //定义更新游标
$FETCH mycurs_UPDATE INTO $Mdeposit,$Mpayout,$Mbalance; //读取数值
$UPDATE acount SET (Mdeposit,Mpayout,Mbalance)= ( $Mdeposit,$Mpayout,$Mbalance)
WHERE CURRENT of mycurs_update; //更新数值
(三)利用开发工具的支持。
许多数据库开发工具都有一些方便的选项或部件来支持并发控制,而不论DBMS是否支持并发控制。我们看一下Delphi与Powerbuilder的并发控制方法。
Delphi是一个优秀的c/s开发工具,它用来查询数据的数据库控件是TQuery,它可以和TUpdatesql控件有机的结合起来完成数据库表数据的浏览和更新。其中在TQuery控件中有一个属性是Updatemod(修改模式),他有三种选择:(1)upWhereAll:在浏览和修改期间只要有人修改了此记录某个列,那么不管你是否修改过这个列,你的修改在提交时都不能成功。(2)upWhereChanged:只根据键值列和你已经修改的列来决定你的修改是否成功,如果别人所修改的本记录的列与你修改的列不相交,那么你的修改仍然是成功的。(3)UpWhereOnly:只根据键值是否修改来判断你的更新是否成功。
与TQuery控件配套使用的TUpdatesql控件根据所指定的修改属性,自动生成所需的更新语句,非常方便。第2种模式是最常用的修改模式,只要别人对记录所做的修改不与自己的重合,那么就会提交成功,这即保证不会发生数据的丢失、覆盖,并且具有较高的并发度。还是上边的例子,比如说客户浏览记录后修改的是记录中Mpayout、Mbalance两列,那么在修改选项upWhereChanged下,Tupdatesql控件所生成的SQL语句是:
UPDATE acount SET (Mpayout,Mbalance)=($Mpayout,$Mbalance)  
WHERE Key=Key_old and Mpayout=Mpayout_old and Mbalance=Mbalance_old;
其中Key_old,Mpayout_old和Mbalance_old是delphi替用户所生成的中间变量,暂存原先数据记录的旧值,用于比较旧值与现在的值是否相等,如果不相等,说明已经有别的用户更改了该记录,那么为了避免丢失修改,该用户的更新操作不能完成,反之则可以完成。那么当出纳员修改帐户时,如果别人已经修改了这个帐户,那么他的这次修改是不成功的,必须重新刷新记录才可能成功修改。对上面的例子进行这种改造,就可以避免银行的损失。
与Delphi媲美的一个另一个工具是著名的Powerbuilder,在其DataWindows的设计中,我们选择菜单Rows|Update…,会出现Specify Update Characteristics的设置窗口,在这个窗口中我们设置Update语句中Where子句的生成,以此来进行并发控制。在这里有三个选项: (1)Key Columns:生成的Where子句中只比较表中的主键列的值与最初查询时是否相同来确定要修改的记录。与Delphi中的UpWhereOnly选项对应。 (2)Key and Updateable Columns:生成的Where子句比较表中主键列和可修改列的值与最初查询时否是相同。与Delphi的upWhereall相对应。 (3)Key and Modified Columns:与Delphi的upWhereChanged选项对应。Where子句比较主键和要修改的列。  
(四)调整应用。
有的数据库没有提供并发控制的功能,例如Foxpro等,象Mysql的某些版本也不支持事务。而且有的开发工具(例如一些网页脚本编辑器等)也没有提供实现并发控制的部件,那么要实现并发控制,就只能借助于调整我们的应用程序和数据库结构的办法了。
可以按照封锁的基本思想来调整应用。在需要进行并发控制的数据库表中增加一个锁字段,这个字段可以是一个布尔型变量,为true则为锁定,为false则为空闲。此时表的结构变为:
列名称  列代码  列类型
帐户号  Id(键值列) Char(10)
户主  Uname Char(10)
存入金额  Mdeposit  Currency
支出金额 Mpayout  Currency  
存款余额  Mbalance Currency
锁  Lock  Boolean
如果一个应用中,客户查询这个表时,可以修改表的记录,那么为了防止别的客户在该用户编辑某记录期间修改这个记录,那么就需要客户在浏览到该记录的数据时,给该记录加上锁(即将锁字段改为true),修改完毕后释放锁(将锁字段改为false)。别的客户要修改这个表的记录的话就先检测一下该记录有没有被加锁,如果已经加锁,则不能进行修改。如果锁字段空闲,那么首先给该记录加锁,然后取记录给客户浏览、编辑,在此期间别的客户不能修改记录。这就很有效的防止了丢失修改。
上面是一种常用的方法,但是也不是完全没有缺点,它可能会产生这样一种副作用:当一个用户决定修改一个记录时,该记录被锁定,等待用户修改,但此时正好用户离开了,那么这条记录将一直被锁定直到用户提交(可能是几个小时之后了)或者会话超时,那么在这一段时间内别的用户就不可以更改这一条记录,导致并发度很低。有一个绕过这个问题的解决办法就是将浏览到的记录记到old_record(自定义的变量)中,再将old_record的内容拷贝到一个新记录new_record(自定义的变量)中,用户编辑new_record,当提交new_record时比较old_record和原先的记录,如果不一样,则表明已经有用户修改了原先的记录,此时把对new_record做的修改放弃;反之则将其内容提交。
上边的方法还有一个小小的不足:在做新旧记录的比较的时候必须比较整条记录,费时间而且程序写起来比较麻烦。可以考虑在原先的表中增添一个时间戳列(此时可以取消lock列),那么此时表的结构变为:
列名称  列代码  列类型
帐户号  Id(键值列) Char(10)
户主  Uname Char(10)
存入金额  Mdeposit  Currency
支出金额 Mpayout  Currency  
存款余额  Mbalance Currency
时间戳  Date  Datetime
当浏览记录时将时间戳值记到old_date(自定义变量)中,再将记录内容记到一个新记录new_record中,用户编辑new_record,当提交new_record时比较old_date和原先的记录中的时间戳,如果不一样,则表明已经有用户修改了原先的记录,此时把对new_record做的修改放弃;反之则将其内容提交。更新语句为:
UPDATE acount SET (Mpayout,Mbalance,Date)=($Mpayout,$Mbalance,$Date)  
WHERE Key=Key_old and Date=$Date_old;
五.总结
我们通常说的并发控制是指在DBMS(数据库管理系统)内部进行的并发控制。而并发控制的方法非常丰富,远不止此。可以借助于数据库本身的能力,也可以利用开发工具,还可以通过调整自己的程序来实现。在数据库应用中,进行并发控制的方法、实现途径多种多样。在选择时所依据的基本原则就是:数据一致性一定要合乎应用的需要,在此基础上,尽量提高并发度。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
32#
 楼主| 发表于 2003-11-23 13:05 | 只看该作者
文档数据库与关系数据库的比较

北京航空航天大学1-53信箱 蒋洪迅(jianghx@990.net)


摘要:随着应用领域的不断拓展和多媒体技术, 人们发现关系数据库的许多限制和不足,因而数据库技术进入了"后关系数据库时代"。文档数据库由此应运而生。本文概要地从数据格式、数据库结构和WEB发布数据三个方面比较了文档数据库与关系数据库的异同,同时区别了文档数据库与过去存储数据的文件系统的不同。
关键词:数据库 Internet 文档数据库 WEB数据库服务器
一. 关系数据库的优势和目前面临的问题
  从60年代末开始, 数据库技术经历了层次数据库、网状数据库和关系数据库而进入数据库管理系统( DBMS)阶段至今, 数据库技术的研究也不断取得进展。80年代, 关系数据库成为发展的主流, 几乎所有新推出的DBMS产品都是关系型的。关系型数据库在计算机数据管理的发展史上是一个重要的里程碑,这种数据库具有数据结构化、最低冗余度、较高的程序与数据独立性、易于扩充、易于编制应用程序等优点,目前较大的信息系统都是建立在结构化数据库设计之上的。
  然而,随着网络技术和软件技术的飞速发展,特别是Internet和Intranet技术的发展,使得非结构化数据的应用日趋扩大。关系数据库从1970年发展至今,虽功能日趋完善,但对数据类型的处理只局限于数字、字符等,对多媒体信息的处理只是停留在简单的二进制代码文件的存储。然而,随着用户应用需求的提高、硬件技术的发展和Intranet/Internet提供的多彩的多媒体交流方式,用户对多媒体处理的要求从简单的存储上升为识别、检索和深入加工,正是用户呼唤出"通用"数据库服务器来处理占信息总量70%的声音、图像、时间序列信号和视频等复杂数据类型。据有关数据,1996年,全球数据库市场的销售额已接近40亿美元,预计到2000年,数据库市场销售额将达到80亿美元。巨大的增长潜力来自复杂数据类型的处理需求,使处理复杂数据类型的"超媒体"数据库将成为各公司投资研发的重点。


二. 全新的"文档数据库"概念
从1989年起,Lotus通过其群件产品Notes提出了数据库技术的全新概念-"文档数据库",文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。
  文档数据库与五、六十年代管理数据的文件系统不同,文档数据库仍属于数据库范畴。首先,文件系统中的文件基本上对应于某个应用程序。当不同的应用程序所需要的数据有部分相同时,也必须建立各自的文件,而不能共享数据,而文档数据库可以共享相同的数据。因此,文件系统比文档数据库数据冗余度更大,更浪费存储空间,且更难于管理维护。其次,文件系统中的文件是为某一特定应用服务的,所以,要想对现有的数据再增加一些新的应用是很困难的,系统不容易扩充。数据和程序缺乏独立性。而文档数据库具有数据的物理独立性和逻辑独立性,数据和程序分离。
文档数据库也不同于关系数据库,关系数据库是高度结构化的,而Notes的文档数据库允许创建许多不同类型的非结构化的或任意格式的字段,与关系数据库的主要不同在于,它不提供对参数完整性和分布事务的支持,但和关系数据库也不是相互排斥的,它们之间可以相互交换数据,从而相互补充、扩展。


三. 关系数据库和文档数据库的异同
下面从三个方面比较两种数据库的异同:
1. 格式文本/多媒体(Rich Text/Multimedia) 在信息时代,所有信息大体上可以分为两类:一类信息能够用数据或统一的结构加以表示。例如,成本、费用、人员、工资以及员工业绩等,都可以用数字或文字来描述或表达。这类信息具有相同的层次或网络结构,我们称之为结构化数据;而另一类信息根本无法用数字或者统一的结构表示,例如,图象、声音等,我们称之为非结构化数据。这些非结构化数据既可以是一段包含大量附加信息(如排版信息)的文字信息,也可能是一段声音、图象,甚至是影像。对于结构化数据和非结构化数据的关系如图所示,非结构化数据包括结构化数据,但又不止是结构化数据;结构化数据属于非结构化数据,是非结构化数据的特例。一般来说,在人们的认识之中,关系数据库最主要的特征就是数据的结构化。然而,随着网络技术和软件技术的飞速发展,特别是Internet和Intranet技术的发展,使得非结构化数据的应用日趋扩大。关系数据库是高度结构化的,这种数据结构化使关系数据库具有冗余度最低、程序与数据独立性较高、易于扩充、易于编制应用程序的特点。但是,随着应用领域的不断拓展, 为满足应用对数据处理不断"苛刻"的要求, 人们开始发现关系数据库的许多限制和不足。因为文档数据库的基本元素就是文档本身,而数据库中的文档可以同时包含结构化的和非结构化的信息,所以,文档数据库能够存储和管理类似文档这样的非结构化数据。特别是,Notes的对象库是一个非常理想的商业信息存储器,可用于高效地存储、传播、分配和管理这类信息。这类信息通常具有丰富的数据类型,如表格(可以是从某个关系数据库或电子表软件中得到的)、格式化文本、WWW的页面、图形、OLE对象、或扫描的图象以及传真件、声频或视频信号这样的多媒体信息。


2. 在结构上 关系数据库是应用数学方法来处理数据库数据的,其数据模型也是建立在数学概念基础上的,在关系模型中,数据在用户观点下的逻辑结构就是一张二维表。而Lotus Notes是一个文档数据库管理系统,文档数据库的基本元素就是文档。这里的文档和关系数据库中的记录相似。Notes文档的结构是由表单(form)定义的,而表单由一组各式各样的字段域组成。
· 域(Field)、域(Domain)和字段(Field)
  在关系数据库中,域(Domain)是属性值的集合,如:大于0小于150的正整数,长度小于25的字符串集合等等。而在文档数据库中,域(Field)的概念出现在表单对象中,域是表单上存储数据的单个元素,域决定了一个独立的文档能包含什么数据。虽二者的中文译文相同,但其实际意义和作用相差千里。反而在文档数据库中域的概念与关系数据库中的字段(Field)相类似。
· 条目(Item)和属性(Attribute)
  在关系数据库中,有属性(Attribute)的概念,即二维表中的每一列称为一个属性,给每一列起一个名称即属性名。而在文档数据库中,就没有"属性",文档拥有的是条目(Item),条目是指存储于文档中的任意数据部分。每一个条目代表文档中一段数据,在用户界面中,是通过表单中的域来显示文档中的条目的。二者虽命名不同,但笔者认为从"属性"的角度更容易理解文档数据库中条目的意义。
· 视图(View)
  在关系数据库和文档数据库中,均有视图的概念。在关系数据库中,视图是指从一个或几个基本表(或视图)导出的表。视图和基本表不同,视图是一个虚表,即视图所对应的数据不实际存储在数据库中,数据库中只存储视图的定义(存在数据字典中)。在文档数据库中,用户通过Notes视图浏览文档。视图是很方便的目录,用户可以从中看到关于文档的概要信息和文档的状态,然后存取特定的Notes文档。文档数据库中文档可以在视图中显示起全部或部分内容,通过视图,用户可以看一组文档的关键域,并可按某一准则对显示的信息进行分类和排序。实质上,二者逻辑上非常相似,即视图所对应的数据均不实际存储在数据库中,数据库中只存储视图的定义。


3. WEB数据库 近年来网络体系结构经历了一次次重大变迁,客户机/服务器结构越来越流行了,Intranet以惊人的速度在短短一年内迅速蔓延,面临新的格局,如何简易地实现"客户机/服务器"连接与"Web/Intranet"连接成为数据库管理人员关注的焦点。计算机技术和网络技术的发展使以网络为中心的计算日益得到重视,WWW系统和数据库成为网络化信息服务的基础。如果能把文档数据库同WWW服务器连接起来,就可以从浏览器中检索文档。这种一体化的信息网络系统:数据库+WWW服务器,便成为下一代Internet开发的新领域。目前,在Web上一个典型的数据库应用程序应包括三个部分:Web浏览器、HTTP 服务器和Web数据库服务器。对于一般的关系型数据库,实现Web数据库的应用通常有两种方法:一种是Web服务器提供中间件连接Web服务器与数据库服务器;另一种是把应用程序下载到客户端直接访问数据库。最常用的中间件技术有通用网关接口(CGI)和应用程序编程接口(API)两种。CGI程序缺陷在于CGI接口不支持用户与数据库间的持续互操作,再就是CGI的效率低,且需要同时运行多个CGI程序。用户每次连至服务器时,服务器都要创建一个事务或运行CGI程序的一个拷贝。这样对于一个复杂的应用或有多个用户访问时,就会加重服务器的负担。API在很大程度上克服了CGI的缺点,但其兼容性差和开发难度大也让广大开发人员望而却步。客户端访问数据库主要包括Java Script和数据库连接器(IDC)等。用Java Script和IDC开发Web数据库虽简单但同时也存在功能有限、不能完全控制其过程等缺点。所以它们也无法胜任较复杂的Web数据库的开发。难道就没有一个开发相对容易、功能强大且高效的Web数据库的开发方法吗?有,答案是-Lotus Notes。Lotus Notes通过文档数据库实现了多媒体文档管理,支持客户机/服务器工作方式。每个数据可以包含若干不同形式的Notes文档。存放在一个或多个Notes服务器上,可以让许多用户存取的数据库称为共享数据库。通过利用服务器存取和数据库存取控制等安全措施,数据库管理员可以规定谁可以存取数据库和在什么范围内使用数据库,各数据库在网上通过复制功能实现同步。这样,通过文档数据库用户可以在网络上存取、追踪储存和组织信息。
四. 结束语
  最近几年,我国的数据库市场飞速发展,并将具有更为巨大的增长潜力,表现为如下特点:首先,在近五年里,用户的选型观念发生了明显的改变,有更多的用户把数据库的重要性放在十分重要的地位,其主要原因是用户将把应用软件和应用需求放在首位,应用软件是否满足用户需求是整个项目是否成功的标志,而应用软件开发直接依赖于数据库开发工具。实际上,大量潜在的投资都在应用软件的开发上;另一个原因是硬件随着芯片技术的发展越来越缺乏特性,硬件指标将变成次要的考虑因素。对行业性应用来讲,以前是制定几家硬件产品作为优选,而今可能是首选数据库厂家再考虑硬件厂家了。正是用户需求的这种变化给数据库厂商提供了新的发展机会。Lotus Notes为各数据库系统集成商提供了强大的文档数据库开发平台,Notes结合了企业级电子邮件、分布式文档数据库与快速应用开发等三位一体的强大技术、完全集成了Internet技术,提供用户完整的,以网络为中心的应用技术平台。可以预言,在不久的将来,Lotus Notes的文档数据库将成为继层次数据库、网状数据库和关系数据库之后的又一热点技术。
参考文献:
1. 萨师煊 王珊《数据库系统概论》
2. 《刍议数据库技术的最新发展》,微电脑世界,1997年第三期,"信息时代"

使用道具 举报

回复
论坛徽章:
22
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
33#
发表于 2003-11-24 02:03 | 只看该作者
好。 辛苦了。

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
34#
 楼主| 发表于 2003-11-28 08:33 | 只看该作者
存储过程,查询存储过程所在的数据库的对象的锁住情况,适用于ms  sql  server7.0  和  ms  sql  server  2000。  

CREATE  PROCEDURE  dbo.usp_lock  AS  
set  nocount  on  
select              p.hostname,  
           l.req_spid  as  spid,  
               l.rsc_objid,  
           left(v.name,4)  As  Type,  
           left(u.name,8)  As  Mode,  
           left(x.name,6)  As  lockStatus,  
           p.program_name,  
           p.loginame,  
           p.status  as  status,  
           p.blocked  
into  #locks  
from              master.dbo.syslockinfo  l  
           join  (select  name,number  from  master.dbo.spt_values  v  where  type  =  'LR')  v  on  l.rsc_type  =  v.number  
           join  (select  name,number  from  master.dbo.spt_values  v  where  type  =  'L')    u  on  l.req_mode  +  1  =  u.number  
           join  (select  name,number  from  master.dbo.spt_values  v  where  type  =  'LS')  x  on  l.req_status  =  x.number  
           join  master.dbo.sysprocesses  p  on  l.req_spid=p.spid  
where      l.rsc_dbid=db_id()   
               and  l.rsc_objid>0  

select    l.hostname,  
           l.spid,  
               isnull(o.name,'  ')  as  objname,  
           l.Type,  
           l.Mode,  
           l.lockStatus,  
           l.program_name,  
           l.loginame,  
           l.status,  
               l.blocked,   
               isnull(p.hostname,'  ')  as  blockhostname,  
               isnull(p.program_name,'  ')  as  blockprogram  
from    #locks  l  
         join  sysobjects  o  on  l.rsc_objid=o.id   
         left  join  master.dbo.sysprocesses  p  on  l.blocked=p.spid  
order  by  o.name,l.hostname  

drop  table  #locks  
GO

使用道具 举报

回复
论坛徽章:
105
萤石
日期:2014-04-06 09:24:42天枰座
日期:2015-07-22 11:25:542014年世界杯参赛球队: 阿尔及利亚
日期:2014-07-10 09:12:26马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11
35#
发表于 2003-11-28 12:04 | 只看该作者

不好意思

直接收藏,谢谢!
不嫌弃的话,到我这里的时候我请你米西米西。

还有我的回复成功率太低。

90%都提示我没有指定thread

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
36#
 楼主| 发表于 2003-11-28 12:10 | 只看该作者

Re: 不好意思

最初由 wollaston 发布
[B]直接收藏,谢谢!
不嫌弃的话,到我这里的时候我请你米西米西。

还有我的回复成功率太低。

90%都提示我没有指定thread [/B]


米西米西,咱喜欢,那?

使用道具 举报

回复
论坛徽章:
52
IT宝贝
日期:2010-11-04 16:48:222013年新春福章
日期:2013-02-25 14:51:24版主4段
日期:2013-03-09 02:21:03Jeep
日期:2013-12-04 15:37:392014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
37#
发表于 2003-11-28 14:48 | 只看该作者

锁问题

觉得锁问题在我们这里没有表现,因为我们用的PowerBuilder在提交修改时可以带上where条件,指定被修改字段必须和上次访问时的值一致才可以。
另外觉得那个例子有问题,为什么要提交25,000?而不是:存款余额+5000?

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
38#
发表于 2003-12-1 16:59 | 只看该作者
本人有个问题请教,我公司数据库是SQL2000的,运行中经常提示锁表,我每次用SELECT * FROM SYSPROCESSES 查询占数据库的进程,然后KILL掉,但是效果不是很好,请问有什么好的方法,能够有效解决问题。

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
39#
发表于 2003-12-2 10:06 | 只看该作者

UPUPUP

UPUPUP

使用道具 举报

回复
求职 : 系统分析师
论坛徽章:
691
博彩大赢家
日期:2014-07-14 11:41:47博彩大赢家
日期:2015-09-24 12:11:05菠菜神灯
日期:2016-04-18 13:59:20NBA季后赛大富翁
日期:2016-04-27 11:51:10NBA季后赛大富翁
日期:2016-06-24 10:29:08芝加哥公牛
日期:2015-06-25 09:32:08芝加哥公牛
日期:2016-04-18 14:22:33芝加哥公牛
日期:2016-10-27 14:28:54芝加哥公牛
日期:2016-12-27 14:16:24芝加哥公牛
日期:2017-04-18 17:07:58
40#
 楼主| 发表于 2003-12-4 12:16 | 只看该作者
修改数据库名称:

关掉企业管理器等,只留下查询分析器,保证没有其他用户的连接和有sysadmin角色的权限。先设置数据库为单用户模式:

sp_dboption 'database_name', 'single user','true'

exec sp_renamedb 'old_database_name','new_database_name'

然后恢复为多用户模式:

sp_dboption 'database_name', 'single user','false'

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表