第 章 多用户环境
数据库并不是一个孤岛 可以想象这样的场景 一个或多个用户都在访问数据库 所有的修改和保存都按照一种正确的顺序执行 不会陷入混乱 在现实中 创建数据库通常都是为了实现多人共享数据 即使对于桌面型数据库 Microsoft Access和OpenOffice BASE 也可以通过网络进行共享 RDBMS服务器本身就是专门设计用于支持多用户环境的
当一个以上的用户访问同一个数据集时 一些新的问题就产生了 哪些数据应该对于每一个用户都可见呢?谁的修改应该具有优先权?在执行一个较长的数据库过程期间 用什么保证数据的修改不会丢失?为了找到这些问题(以及很多其他问题)的答案 下面将介绍会话 事务和锁的概念
上面的这些问题可以用RDBMS的术语重新表述为
事务为潜在的数据一致性问题提供了解决方案
锁用于处理数据的并发性问题
会话代表了事务和锁存在的上下文环境
会话
在RDBMS服务器和访问它的一个用户之间发生的任何通信过程都是发生在一个会话的上下文环境中 可以将会话视为一个唯一的通道 它仅为你打开 供你访问数据 或者在桌面型数据库的情形下 例如Microsoft Access和OpenOffice BASE 就是专属于你自己的一个数据文件的副本 当你连接到数据库并通过认证时 RDBMS将为你自动创建一个会话
在多用户环境中 令人担忧的问题之一就是数据的完整性 当一个客户端应用程序建立了一个到RDBMS服务器的连接时 称为 打开了一个会话 会话就是该应用程序与服务器进行通信的私有通道 在会话期间 用户可能修改了一些首选项(例如默认语言或默认数据格式) 这些设置仅影响到当前这个特定的用户环境 并且仅仅只在该会话期间有效 各种RDBMS对会话的实现细节和会话的默认行为可能有所差异 但这些基本的原则是保持一致的
本书中使用的工具都是客户端在会话上下文中访问RDBMS服务器的例子 对于桌面型数据库则有所不同 例如Microsoft Access文件 它既可以作为数据存储使用 也可以包含很多通常与应用程序相关的对象 例如表单 报表等(有很多办法可以将这些功能划分到前端和后端文件中) 对于Microsoft Access 会话就是打开的mdb/accdb文件的一个本地副本 在使用完之后必须将其合并回 主 文件(关于这一话题的更多内容 请参考有关Microsoft Access的专业出版物)
OpenOffice BASE的架构与Microsoft Access不同 从本质上讲 OpenOfficeBASE被设计为一个桌面型的通道 为任何支持JDBC驱动程序的数据库提供一个前端 它内置的HSQLDB数据库引擎是一个默认的选择 嵌入版本的OpenOffice BASE并未设计用于多用户环境
RDBMS为各自的RDBMS服务器都提供了一些命令行工具 这是所有RDBMS的共同特性 所有RDBMS都提供了一个图形化的用户界面(GUI) 另外还有很多第三方工具 关于这些工具的更多信息 请参考附录C和附录D的内容
SQL标准定义了很多参数 可以使用这些参数来连接数据库 并在会话期间保持这些参数 RDBMS已经实现了其中绝大部分参数 尽管在某些元素的实现上使用了私有的语法 但是只是语法形式的不同 本质是一样的
在Oracle中 为了建立一个数据库连接 用户必须具有系统特权CREATESESSION;要想修改会话的参数 用户必须具有ALTER SESSION特权 在初始时 会话的所有默认参数都是从一个特殊的Oracle配置文件中加载的 只有数据库管理员或者具有必要特权的人才能修改这个配置文件 一旦连接建立之后(即创建了会话) 用户就可以根据自己的偏好和工作的要求修改会话的参数
IBM DB 为会话环境提供了非常少的用户控制 它提供了一个SET SESSION AUTHORIZATION语句(遵循SQL标准)和一个等效的SET SESSION_USER语句 用于修改会话的上下文
SETPASSTHRU语句为会话提供了最直接的控制 它可以为将SQL数据直接提交到数据库打开和关闭一个会话 另外 在会话期间创建的全局临时表将使用SESSION组件作为限定的模式(在临时表的名称与某个永久表的名称相同的情况下 避免在访问表时出现歧义)
当客户端终止了一个会话 自发地终止会话或异常地终止会话 为会话设置的所有参数都将消失 此外 对于所有悬而未决的事务 在客户端自发地终止会话的情况下将执行一个隐式的提交 在会话异常终止的情况下将执行一个回滚
数据库管理员(DBA)可以杀死或断开一个会话 但在各个RDBMS中执行该命令的语法存在一定的差别
试一试修改会话参数
Microsoft SQL Server 提供了大量的语句 可以修改当前会话的设置 这些语句并不是SQL标准的一部分 实际上它们是Transact SQL方言的一部分 下面的例子将修改其中一个设置 ANSI_NULLS 并查看该设置对查询输出的影响
( ) 打开Microsoft SQL Server Management Studio Express 连接到LIBRARY数据库
( )下面的语句用于从LIBRARY数据库的PHONE表中获取所有BK_PRICE字段不为NULL的记录
SET ANSI_NULLS ON
GO
SELECT bk_title
FROM books
WHERE bk_price <> NULL
GO
( row(s) affected)
( ) 尽管实际上可以料想到 LIBRARY数据库中的所有图书都具有相应的价格 表中一定存在满足这一条件的记录 但是该查询却没有返回任何记录
( ) 清除查询窗格中的内容 输入新的SQL批语句 如下所示
SET ANSI_NULLS OFF
GO
SELECT bk_title
FROM books
WHERE bk_price<> NULL
GO
BK_TITLE
SQL Bible
Steppenwolf
示例说明
由于NULL并不是一个特殊的值 它是一个 表示缺少值的占位符 因此对NULL值应该区别对待 SQL 标准强制要求凡是涉及NULL值的比较 *** 作总是返回FALSE 把MicrosoftSQL Server 的ANSI_NULLS参数调整为ON将指示数据库遵循这一标准 但Oracle / g和IBM DB 都没有类似于ANSI_NULLS这样的设置
如果使用更为标准的ISNULL语法 就可以完全避免这一情况
SELECT bk_title
FROM books
WHERE bk_price IS NOT NULL
在所有RDBMS中 上面这个查询都可以返回正确的结果
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16452
SQL是StructuredQueryLanguage(结构化查询语言)的缩写。SQL是专为数据库而建立的 *** 作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。
SQL数据库的数据体系结构基本上是三级结构,但使用术语与传统关系模型术语不同。在SQL中,关系模式(模式)称为"基本表"(basetable);存储模式(内模式)称为"存储文件"(storedfile);子模式(外模式)称为"视图"(view);元组称为"行"(row);属性称为"列"(column)。
扩展资料:
SQL数据库的优点:
1、易用性高:
适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等。
2为数据管理与分析带来了灵活性:
允许单位在快速变化的环境中从容响应,从而获得竞争优势。从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要。作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序、为企业赢得核心竞争优势打开了胜利之门。
Mysql是目前互联网使用最广的关系数据库,关系数据库的本质是将问题分解为多个分类然后通过关系来查询。 一个经典的问题是用户借书,三张表,一个用户,一个书,一个借书的关系表。当需要查询某个用户借书情况或者是书被那些人借了,就用关系查询来实现。
关系数据库范式
来自英文Normal form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update) *** 作异常。总共有六种范式:第一范式(1NF)、第二范式(2NF)、 第三范式 (3NF)、巴斯-科德范式(BCNF)、 第四范式 (4NF)和 第五范式 (5NF,又称完美范式)。
1NF是指数据库表的每一列都是不可分割的原子数据项。2NF必须满足1NF,要求数据库表中的每行记录必须可以被唯一地区分。3NF在2NF基础上,任何非主 属性 不依赖于其它非主属性(在2NF基础上消除传递依赖)。BCNF是在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖), 满足BCNF不再会有任何由于函数依赖导致的异常,但是我们还可能会遇到由于多值依赖导致的异常。4NF的定义很简单:已经是BC范式,并且不包含多值依赖关系。5NF处理的是无损连接问题,这个范式基本没有实际意义,因为无损连接很少出现,而且难以察觉。而域键范式试图定义一个终极范式,该范式考虑所有的依赖和约束类型,但是实用价值也是最小的,只存在理论研究中。
Catalog和Schema
是数据库对象命名空间中的层次,主要用来解决命名冲突的问题。从概念上说,一个数据库系统包含多个Catalog,每个Catalog又包含多个Schema,而每个Schema又包含多个数据库对象(表、视图、字段等)。但是Mysql的数据库名就是Schema,不支持Catalog。
Mysql的数据库引擎主要有两种MyISAM和InnoDB,MyISAM支持全文检索,InnoDB支持事务。
SQL中的通配符‘%’代表任意字符出现任意次数。‘_’代表任意字符出现一次。SQL与正则表达式结合查询一般用在WHERE table_name REGEXP '^1234'。子查询是从里到外执行。
数据库联结(join)涉及到外键,外键是指一个表的列是另一个表的主键,那么它就是外键。笛卡尔积联结(不指定联结条件时)生成的记录条目是单纯的第一个表的行乘以第二个表的列数。用得最多的是等值联结也叫内部联结。
高级联结还有自连接,是指查询中的两张表是同一张表,它通常作为外部语句用来代替从相同表中检索数据时使用的子查询。自然联结使每个列只返回一次。外部联结是指联结包含了那些在相关表中没有关联行的行。例如列出所有产品及其订购数量,包括没有人订购的产品。LEFT OUTER JOIN指选择左边表的所有行。
组合查询是指采用UNION等将两个查询结果取并集。
视图是查看存储在别处的数据的一种工具,它本身并不包含数据,因此表的数据修改了,视图返回的数据也将随之修改,因此如果使用了复杂或嵌套视图会对性能有较大的影响。视图的作用之一是隐藏复杂的SQL通常会涉及到联结查询。
存储过程类似于批处理,包含了一条或多条SQL语句。语法:
CREATE PROCEDURE name()
BEGIN
SQL
END
-------------------------
CALL name()//来调用存储过程
游标有DECLARE定义,游标与存储过程是绑定的,存储过程处理完成,游标就会消失。游标被打开后可以使用FETCH语句访问每一行。
触发器是在某个时间发生时自动执行某条SQL语句。语法:
CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW
事务处理可以维护数据库的完整性,保证批量的 *** 作要么完全执行,要么完全不执行。包括事务、回退、提交、保留点几个关键术语。ROLLBACK只能在一个事务处理内使用。他不能回退CREATE和DROP *** 作。使用COMMIT保证事务提交。复杂的事务处理需要部分提交或回退,因此我们需要使用保留点SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留点越多越好。保留点在事务执行完成后自动释放。
以上就是关于SQL实战新手入门:会话全部的内容,包括:SQL实战新手入门:会话、SQL数据库是什么(mysql数据库是什么)、数据库(mysql)关键知识等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)