《数据库原理与应用》实验指导书

更新时间:2024-05-18 22:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据库原理与应用》实验指导书

万雪勇

安全管理系 2011.9

目 录

实验1 数据库和表的建立及数据完整性设置 实验2 SQL实验3 SQL实验4 实验5 实验6 实验7 实验8 实验9 查询操作 数据操作与视图 数据库的安全性管理 存储过程和触发器 数据库的备份与恢复 数据库应用系统综合设计 事务并发控制操作

简单的Web数据库应用(选做)

1

实验1 数据库和表的建立及数据完整性设置

一、实验目的:

1. 掌握表(关系)的建立方法;

2. 掌握表结构(关系模式)的修改方法;

3. 实践DBMS提供的数据完整性功能,加深对数据完整性的理解。

二、实验内容:

1. 在studentdb数据库中利用查询分析器创建以下3个表,同时完成数据完整性的定义(实体完整性、参照完整性和用户定义的域完整性): student(学生信息表): 主码 Pk 列名 sno sname ssex sage sdept 数据类型 char char char smallint char 宽度 9 10 2 15 小数位 空否 N N Y Y Y 取值范围 不小于12 备 注 学号 姓名 性别 年龄 系名

course(课程表): 主码 Pk 列名 cno cname cpno ccredit 数据类型 Char Char Char smallint 宽度 4 20 4 小数位 空否 N Y Y Y 备 注 课程号 课程名称 先行课号 学分

sc(学生选课表): 主码 Pk 2. 在spjdb数据库中利用查询分析器创建以下4个表,同时完成数据完整性的定义(实体完整性、参照完整性和用户定义的域完整性): S(供应商信息表): 主码 Pk 列名 sno sname status city 数据类型 char char smallint char 宽度 2 10 10 小数位 空否 N N Y Y 取值范围 大于0 备 注 供应商号 供应商名称 供应商状态 所在城市 列名 sno cno grade 数据类型 宽度 Char Char Decimal 9 4 5 小数 1 空否 N N Y 外码 Fk Fk 参照关系 student course 取值范围 0≤x≤100 备 注 学号 课程号 成绩

P(零件信息表): 主码 Pk 列名 pno 数据类型 char 宽度 2 小数位 空否 N 取值范围 备 注 零件号 pname color weight char char smallint 10 2 N Y Y 大于0 零件名称 颜色 重量

J(工程项目表): 主码 Pk

SPJ(供应情况表): 主码 Pk 列名 sno pno jno qty 数据类型 宽度 小数 Char Char Char smallint 2 2 2 空否 N N N Y 外码 Fk Fk Fk 参照关系 取值范围 S P J x>0 备 注 供应商号 零件号 工程项目号 数量 列名 jno jname city 数据类型 char char char 宽度 2 10 10 小数位 空否 N N Y 取值范围 备 注 工程项目号 工程项目名称 所在城市 3.修改表结构,具体要求如下:

(1) 将表course的cname列的数据类型改为varchar(40).

(2) 为表student增加一个新列: birthday(出生日期), 类型为datetime, 默认为空值. (3) 将表sc中的grade列的取值范围改为小于等于150的正数. (4) 为Student表的“Ssex”字段创建一个缺省约束,缺省值为?男?

(5)为“Sdept”字段创建一个检查约束,使得所在系必须是?CS?、?MA?或?IS?之一。 (6)为Student表的“Sname”字段增加一个唯一性约束 (7)为SC表建立外键,依赖于Student表的fk_S_c约束。

(8)禁止启用Student表的“Sdept”的CHECK约束ck_student。 4.分别建立以下索引(如果不能成功建立,请分析原因) (1) 在student表的sname列上建立普通降序索引. (2) 在course表的cname列上建立唯一索引. (3) 在sc表的sno列上建立聚集索引.

(4) 在spj表的sno(升序), pno(升序)和jno(降序)三列上建立一个普通索引.

三、提 示:

1. 建立表, 修改表, 建立索引需具有create table的权限. 2. 创建基本表的SQL语句是CREATE TABLE . 简单语法格式:

CREATE TABLE 表名

( 列名 数据类型 [default 缺省值] [not null] [,列名 数据类型 [default 缺省值] [not null]]

……

[,primary key(列名 [,列名] …)] [,foreign key (列名 [,列名] …) references 表名 (列名 [,列名] …)] [,check(条件)] );

1

一般语法格式:

CREATE TABLE [ database_name.[owner].] table_name

({| column_name | < table_constraint> }[,…n] )

[ON { filegroup | DEFAULT }] [TEXTIMAGE_ON {filegroup | DEFAULT }]

::={column_name data_type}[DEFAULT constant_expression] | [IDENTITY [(seed, increment )]] [ROWGUIDCOL] [] […n]

参数说明:

①[database_name.[owner].] table_name:定义表的名字,表名的长度不得超过128个字节,如果是临时表,则表名不能超过116个字符。

:列的定义。

③column_name:列的名字。列的命名必须遵守有关数据库对象的命名规则。 ④data_type:列的数据类型。

⑤DEFAULT constant_expression:定义该列的默认值。 ⑥IDENTITY:定义该列是一个标识列。当一个新的数据行插入表中的时候,SQL Server2000为标识列提供一个唯一的、递增的数值。在一张表格中,只能定义一个标识列。在定义标识列时,必须同时定义起始值和增量。

⑦Seed:定义标识列的起始值。所谓起始值就是插入表的第一行的数据的标识列的值。Increment:定义标识列的增量。所谓增量就是插入表的最近一行相对与前一行标识列的数据值的增量。

⑧ROWGUIDCOL:定义该列是一个行全局唯一的标识列。在一张表中只有一个唯一标识符列可以被定义为ROWGUIDCOL。column_constraint:定义与列相关联的约束。

⑨table_constraint:定义对表的约束。

⑩ON { filegroup | DEFAULT }:定义将表存储在某一个指定的文件组中,DEFAULT表示将表存储在默认文件组中。[TEXTIMAGE_ON {filegroup | DEFAULT }]:如果表中有ntext、text或image类型的数据,则将这些数据存储在某一个指定的文件组里。

3. 修改表结构的SQL语句是ALTER TABLE, 修改的内容包括:修改、增加、删除列或约束、使约束和触发器无效等。 简单语法格式:

alter table <表名>

[add <列名> <数据类型> [<列级完整性约束>]] // 增加新列 [drop <完整性约束名>]

// 删除约束

[drop column <列名>]

// 删除列

[alter column <列名> <数据类型> [<列级完整性约束>] ]; //修改列定义

其中列级完整性约束包括:

·空值约束 NOT NULL和NULL ·主关键字约束 PRIMARY KEY ·唯一性约束 UNIQUE

·参照完整性约束 FOREIGN KEY

一般语法格式:

ALTER TABLE table

2

{[ALTER COLUMN column_name { new_data_type [NULL| NOT NULL]|{ADD |DROP} ROWGUIDCOL }]

|ADD {[]| column_name AS computed_column_expression }[,…n] |ADD {}[,…n]

|DROP {[CONSTRAINT] constraint_name |COLUMN column }[,…n] |{CHECK |NOCHECK} CONSTRAINT {ALL | constraint_name [,…n] |{ENABLE |DISABLE} TRIGGER {ALL |trigger_name [,…n]}

参数说明:

①ALTER COLUMN:修改已经存在的列的属性。

②{ADD |DROP} ROWGUIDCOL:将指定列定义成ROWGUIDCOL,或者删除该列的ROWGUIDCOL属性。

③ADD {[]| column_name AS computed_column_expression}[,…n]:增加新的列。

④ADD {}[,…n]:定义新的表约束。

⑤DROP { [CONSTRAINT] constraint_name |COLUMN column }[,…n]:删除约束或删除列。

⑥{CHECK |NOCHECK} CONSTRAINT {ALL | constraint_name [,…n]}:使所有约束或者指定的约束有效或失效。

例:使cnst_example表中的约束salary_cap失效。

ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap

⑦{ENABLE |DISABLE} TRIGGER {ALL |trigger_name [,…n]}:使所有或部分触发器有效或无效。

例:使用T_SQL语句对学生表进行各种修改。

①向表中添加新的字段:在学生表中添加一个“class”字段,数据类型为字符型。 ALTER TABLE student add class char(10)

②删除表中的旧列:将学生表中的“class”字段删除。 ALTER TABLE student DROP column class ③更改表中的约束:

删除某列的约束:将SC表中的外码约束FK_sc_sno删除。

ALTER TABLE sc DROP FK_sc_sno

将Student表中的主码约束PK_student_sno删除。

ALTER TABLE student DROP PK_student_sno

为某列添加约束:为Student表的“Ssex”字段创建一个缺省约束,缺省值为?男?。

ALTER TABLE student ADD constraint def_ssex DEFAULT '男' FOR ssex 更改Student表中的“sno”字段的宽度为10及非空约束。

ALTER TABLE student ALTER COLUMN sno char(10) NOT NULL 为Student表添加一个主码约束PK_student_sno。

ALTER TABLE student ADD CONSTRAINT PK_student_sno PRIMARY KEY(sno) 为SC表添加一个外码约束FK_sc_sno。

ALTER TABLE sc ADD CONSTRAINT FK_sc_sno FOREIGN KEY (sno)

REFERENCES student(sno)

④给学生表增加“grade”字段并加上CHECK约束,让其不可以大于100。 ALTER TABLE student ADD grade int Constraint ch_grade check(grade<100) Exec sp_help student

⑤给学生表中添加“birthday”字段,并且这个日期不能在录入当天的日期之后。

3

Alter table student Add birthday DATETIME NULL CONSTRAINT ch_birthday CHECK (birthday

⑥添加具有默认值的可为空的列:

在学生表中加入“matriculationday”字段,并且这一字段的默认值为录入当天的日期。

Alter table student Add matriculationday smalldatetime NULL Constraint adddateflt Default getdate()

4.建立索引的SQL语句是CREATE INDEX, 语法格式: CREATE [UNIQUE] [CLUSTERED] INDEX <索引名>

ON <表名>(<列名>[ ASC | DESC ] [,<列名>[ ASC | DESC ] … ] )

其中 UNIQUE指出是唯一索引, CLUSTERED指出是聚集索引。

4

实验2 SQL查询操作

一、实验目的:

1. 熟练掌握SELECT语句,能够运用该语句完成各种查询; 2. 观察查询结果, 体会SELECT语句实际应用;

3.要求学生能够在查询分析器中使用SELECT语句进行单表查询和多表查询。

二、实验内容:

完成如下查询:

1. 参照教材P82表中的数据,完成以下查询:

(1)查询course表中所有学分大于2并且序号小于5的课程信息。 (2)查询学分界于2和8之间的课程的信息。

(3)从course表中查询出课程号为1或4或7的课程的课程号、课程名称、以及学分。 (4)从course表中查询学分大于3的课程信息,并按课程号升序排列。 (5)查询每个学生及其课程的平均分情况。

(6)查询选修2号课程且成绩在80分以上的学生信息。 (7)查询每个学生的学号、姓名、选修的课程及成绩。

(8)查询所有计算机系学生的学号、选修课程号以及分数。(使用IN谓词)。 (9)查询选修了课程名为“操作系统”的学生学号和姓名。

(10)查询所有计算机系学生的学号、选修课程号以及分数(使用EXISTS谓词)。 2.(选做) 参照教材P75表中的数据,完成P127习题5中(1)~(7)的查询。

三、提示:

1. SELECT语句的语法格式如下: 基本格式:

SELECT [ALL|DISTINCT] <表达式1>[,<表达式2>… ] FROM <表名1>[,<表名2>… ] [WHERE <逻辑表达式>]

[GROUP BY <列名>[,<列名>… ][HAVING <谓词|条件>]] [ORDER BY <列名>[ASC|DESC][,<列名>[ASC|DESC]… ]]

一般格式:

SELECT [ALL|DISTINCT] [TOP n [PERCENT] [WITH TIES]] [ INTO ]

[ FROM { < table_source > } [ , ... n ] ]

[ WHERE < search_condition > | < old_outer_join > ]

[ GROUP BY [ ALL ] group_by_expression [ , ... n ] [ WITH { CUBE | ROLLUP } ] ] [HAVING ]

::={*|{table_name|view_name|table_alias }.*|{column_name}

[[AS] column_alias]}[,…n]

< table_source > ::= table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ] | view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ] | rowset_function [ [ AS ] table_alias ]

5

| user_defined_function [ [ AS ] table_alias ]

| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] | < joined_table >

< joined_table > ::= < table_source > < join_type > < table_source > ON < search_condition > | < table_source > CROSS JOIN < table_source > | [ ( ) < joined_table > [ ] ]

< join_type > ::= [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ < join_hint > ] JOIN

< old_outer_join > ::= column_name { * = | = * } column_name 参数说明:

(1)ALL:默认设置,指定在结果集中可以显示重复行。

(2)DISTINCT:指定在结果集中只能显示唯一行,空值被认为相等。

(3)TOP n:指定只从查询结果集中输出前n行。N是介于0~4294967295之间的整数。 (4)PERCENT:从结果集中输出前百分之几行,当指定时带PERCENT,n的值必须介于0~100之间。

(5)WITH TIES:指定从结果集中返回附加的行,这些行包含与出现在TOP n(PERCENT)行最后的ORDER BY列中的值相等的值。如果指定了ORDER BY子句,则只能指定TOP…WITH TIES。

(6):为结果选择的列。选择列表是以逗号分隔的一系列表达式。 (7)INTO :创建新表并将结果行从查询插入新表中。

用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。

(8) FROM < table_source >: 指定要在Transact-SQL语句中使用的表或视图(带或不带别名均可)。可在语句中使用多达256个表。可将table变量指定为表源。 < table_source >中的参数说明见(19)。

(9)< old_outer_join >: 使用不标准的产品专用语法和 WHERE 子句指定外联接。*= 运算符用于指定左向外联接,=* 运算符用于指定右向外联接。

注:这种语法具有潜在的二义性解释并且不标准,因此不提倡使用这种语法进行外联接。而应在 FROM 子句中使用联接运算符指定联接。不能在同一语句中同时使用这两种方法。

(10):通过使用谓词限制结果集内返回的行。对搜索条件中可以包含的谓词数量没有限制。

(11) *:指定在FROM子句内返回所有表和视图内的所有列,列按FROM子句所指定的由表或视图返回,并按他们在表或视图中的顺序返回。

(12)column_name:要返回的列名,必要时限定column_name以避免二义性引用,当FROM子句中的两个表内包含重复名的列时会出现该情况。

(13)column_alias:是查询结果集内替换列名的可选名。

(14)GROUP BY ALL: 包含所有组和结果集,甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。

如果访问远程表的查询中有 WHERE 子句,则不支持 GROUP BY ALL 操作。

(15)group_by_expression : 是对其执行分组的表达式。group_by_expression 也称为分组列。group_by expression 可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。

6

说明 text、ntext 和 image 类型的列不能用于 group_by_expression。

对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。

(16)CUBE: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。

结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。

(17)ROLLUP: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。

重要提示:使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,SQL Server 将返回错误信息并取消查询。

(18) HAVING : 指定组或聚合应满足的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。当 HAVING 与 GROUP BY ALL 一起使用时,HAVING 子句替代 ALL。如果不使用 GROUP BY 子句,HAVING 的行为与 WHERE 子句一样。

注:在HAVING子句中不能使用text、image和ntext数据类型。在SELECT语句中使用HAVING 子句不影响CUBE运算符分组结果集和返回汇总聚合行的方式。

(19) < table_source >中的参数说明: table_name: 表名。FROM 关键字之后的表和视图的顺序并不影响返回的结果集。当 FROM 子句中出现重复名称时将报告错误。

[AS] table_alias: table_name、view_name 或 rowset_function 的别名,为方便起见而使用,或用于区分自联接或子查询中的表或视图。别名通常是一个缩短了的表名,用于在联接中引用表中的特定列。如果联接中的多个表中有相同名称的列存在,SQL Server 要求必须使用表名或别名来限定列名。(如果定义了别名则不能使用表名)。

WITH ( < table_hint > ) : 指定表扫描、查询优化器要使用的一个或多个索引或查询优化器要对此表、此语句使用的锁定方法。有关更多信息,请参见\表提示\。

view_name: 是视图名称。视图是一个\虚拟表\,通常创建为一个或多个表中列的子集。 WITH ( < view_hint > ) :指定索引视图扫描。默认情况下,视图在查询优化器处理查询之前展开。视图提示只能用在 SELECT 语句中,而不能用于 UPDATE、DELETE 或 INSERT 语句。

rowset_function: 指定一个行集函数,该函数返回可替代表引用的对象。 user_defined_function : 指定用户定义的函数,该函数返回一个表。如果用户定义的函数是一个内置的用户定义函数,则前面必须加两个冒号,如:FROM ::fn_listextendedproperty

derived_table: 是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。 column_alias: 替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名,并将整个列别名列表用圆括号括起来。

: 由两个或更多表的积组成的结果集,例如: SELECT *

FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3 RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4 ON tab3.c1 = tab4.c1

7

实验8 事务并发控制操作

一、实验目的

使学生能够理解和掌握SQL Server2000提供的三种封锁机制。

二、实验内容

1、SQL Server2000提供了三种封锁机制

为了保证数据的一致性,并且允许最大量的并发用户,SQL Server2000提供了三种封锁机制,即独占封锁、共享封锁和更新封锁。封锁的对象可以是表格、页或者记录。

?共享封锁:共享封锁是为读操作设置的一种封锁,目的是想读到一组不变的数据,也就是在读数据的过程中,不允许其他用户对该数据进行任何修改操作。

?更新封锁:当需要对一个记录或一组记录进行更新时 (只是修改,不包括插入和删除)使用更新封锁,该封锁的目的是防止其他用户在同一时刻修改同一记录。已经实施更新封锁的记录,拒绝来自其他用户的更新封锁或独占封锁。

?独占封锁:独占封锁也叫排他封锁,这是最严格的一类封锁。当需要对表实施插入、删除或修改操作时,应该使用独占封锁。已经实施独占封锁的表,拒绝来自其他用户的任何封锁,但不拒绝其他用户的一般读操作。

所有的封锁都将在事务结束(提交或撤消)时自动释放。SQL Server2000 使用SELECT语句完成封锁操作,在指定选择的表的同时在FROM子句中指定对表所实施的封锁。

2、SQL Server2000的封锁命令

SQL Server2000的封锁操作是在相关语句的“WITH (table_hint)子句中完成的,可用在SELECT、INSERT、UPDATE、DELETE等语句中指定表级锁定的方式和范围。常用的封锁关键词有:

?TABLOCK:对表施加共享锁,在读完数据后立即释放封锁,它可以避免读“脏”数据,但可能引起不可重复读问题。

?HOLDLOCK:与TABLOCK一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放,它可以保证数据的可重复读。

?NOLOCK:不施加任何封锁,仅用于SELECT语句,它会引起读“脏”数据。 ?TABLOCKX:对表施加排它锁。

UPDLOCK:对表中指定元组施加更新锁,这时其他事务可对同表中的其他元组也施加更新锁,但不能对表施加任何锁。

3、SQL Server2000的4种隔离级别

SQL Server2000支持标准SQL中定义的隔离级别:

?未提交读(READ UNCOMMITED):事务隔离的最低级别,仅可保证不读物理损坏的数据。 ?提交读(READ COMMITED):SQL Server2000的默认级别,可以保证不读“脏”数据。 ?可重复读(REPEATABLE READ):可以保证读一致性。

?可串行化(SERIALIZABLE):事务隔离的最高级别,事务之间完全隔离,在该级别上可以保证并发事务均是可串行的。

事务必须运行在可重复读或更高隔离级别上才可防止丢失更新。设置隔离级别的命令是: SET TRANSACTION ISOLATION LEVEL

{READ COMMITED | READ UNCOMMITED | REPEATABLE READ| SERIALIZABLE} 提示:

1. 建测试表sales

CREATE TABLE sales ( id char(5),

23

qty int, b int

);

输入数据: insert into sales values( 'A0001', 0,10 );

2. 事务原子性实验

定义如下事务,运行结束前,停止SQL SERVER服务,然后重启服务查看qty和b的值是否有变化。

begin tran update sales set qty = qty - 10 where id = 'A0001' waitfor delay '00:00:30.000' update sales set b = b + 10 where id = 'A0001' commit tran

定义如下SQL语句,运行结束前,停止SQL SERVER服务,然后重启服务查看qty和b的值是否有变化。

update sales set qty = qty - 10 where id = 'A0001' waitfor delay '00:00:30.000' update sales set b = b + 10 where id = 'A0001'

3.丢失修改 例1:

事务一和事务二代码相同,如下 declare @sl int begin tran select @sl = qty from sales where id = 'A0001' waitfor delay '00:00:30.000' update sales set qty = @sl - 1 where id = 'A0001' commit tran

执行结果:qty==1,事务一的修改丢失。

原因:事务执行过程中对操作的数据没有加锁。

例2: 丢失修改 事务一代码 declare @i int declare @sl int select @i = 1

while( @i <= 2000) begin begin tran select @sl = qty from sales where id = 'A0001' waitfor delay '00:00:00.002' update sales set qty = @sl + 1 where id = 'A0001' commit tran select @i = @i + 1

24

end

事务二代码 declare @i int declare @sl int select @i = 1

while( @i <= 2000) begin begin tran select @sl = qty from sales where id = 'A0001' waitfor delay '00:00:00.002' update sales set qty = @sl - 1 where id = 'A0001' commit tran select @i = @i + 1 end

4. 不可重复读 例1:

事务一代码如下

declare @qty int declare @b int begin tran select @qty = qty from sales where id = 'A0001'

select @b = b from sales where id = 'A0001' print(@qty+@b) waitfor delay '00:00:5.000' select @qty = qty from sales where id = 'A0001'

select @b = b from sales where id = 'A0001' print(@qty+@b) commit tran

事务二代码

declare @b int begin tran select @b = b from sales where id = 'A0001' update sales set b = @b *2 where id = 'A0001' commit tran

例2:

不可重复读 事务一代码如下 declare @i int declare @sl int declare @s2 int select @i = 1

while( @i <= 2000) begin begin tran select @sl = qty from sales where id = 'A0001' waitfor delay '00:00:00.002'

25

select @s2 = qty from sales where id = 'A0001' if(@sl<>@s2) print('non-repeatable read') commit tran select @i = @i + 1 end

事务二代码 declare @i int declare @sl int select @i = 1

while( @i <= 2000) begin begin tran select @sl = qty from sales where id = 'A0001' waitfor delay '00:00:00.002' update sales set qty = @sl + 1 where id = 'A0001' commit tran select @i = @i + 1 end

5. 读脏数据

事务一代码

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED declare @b int begin tran

select @b = b from sales where id = 'A0001' print(@b)

update sales set b = @b *2 where id = 'A0001' select @b = b from sales where id = 'A0001' print(@b) waitfor delay '00:00:20.000' rollback

事务二代码

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED declare @b int begin tran select @b = b from sales where id = 'A0001' print(@b) commit tran

6. 加锁实验

(1) 一级封锁协议不会丢失修改,但不能保证不出现另两种异常丢失修改. declare @sl int begin tran select @sl = qty from sales with (xlock) where id = 'A0001' waitfor delay '00:00:10.000' update sales set qty = @sl - 1 where id = 'A0001' commit tran

26

不可重复读 事务一

declare @qty int declare @b int begin tran select @qty = qty from sales where id = 'A0001'

select @b = b from sales where id = 'A0001' print(@qty+@b) waitfor delay '00:00:15.000' select @qty = qty from sales where id = 'A0001'

select @b = b from sales where id = 'A0001' print(@qty+@b) commit tran 事务二

declare @b int begin tran select @b = b from sales with(xlock) where id = 'A0001' update sales set b = @b *2 where id = 'A0001' commit tran

读脏数据 事务一

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED declare @b int begin tran

select @b = b from sales with (xlock) where id = 'A0001' print(@b)

update sales set b = @b *2 where id = 'A0001' select @b = b from sales where id = 'A0001' print(@b) waitfor delay '00:00:20.000' rollback 事务二

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED declare @b int begin tran select @b = b from sales where id = 'A0001' print(@b) commit tran

(2) 二级封锁协议可以避免丢失修改和读脏,但不能保证可重复读。在sql server中默认设置即可避免读脏。

(3) 三级封锁协议可以完全避免这三种异常. 可重复读

27

事务一

declare @qty int declare @b int begin tran select @qty = qty from sales with(holdlock) where id = 'A0001' select @b = b from sales with(holdlock) where id = 'A0001' print(@qty+@b) waitfor delay '00:00:15.000' select @qty = qty from sales where id = 'A0001' select @b = b from sales where id = 'A0001' print(@qty+@b) commit tran 事务二

declare @b int begin tran select @b = b from sales with(xlock) where id = 'A0001' update sales set b = @b *2 where id = 'A0001' commit tran

28

实验9 简单的Web数据库应用(选做)

实验目的:

Windows 环境Web服务器IIS的安装、指标配置、测试和使用技能;网页超文本标记语言HTML/DHTML的知识与使用方法; 脚本的应用:JavaScript、VBScript的使用技巧,ASP脚本插入HTML页面的语法规则及操作技巧,使用ASP的服务器端脚本功能接收用户信息方法;通过实例掌握数据库信息的发布技术。学生通过本实验应能够建立一个具有某种功能的站点,供网上用户共享。

1. 使学生能够了解Web技术的特点( HTML,ASP,VBScript, JavaScript, IIS, ODBC, Web ); 2. 理解Web数据库应用中的对象、属性、事件等概念;

3. 熟悉一种Web数据库应用的开发环境( Framework, Dreamweaver, ASP, JSP, PHP );

4. 利用Web技术,结合ASP和SQL Server构建一个数据管理站点, 初步体会简单的Web数据库应用系统的开发全过程。

实验内容:

自主研制一个基于SQL Server数据库的Web应用系统,能满足Internet用户的如下操作: (1)检查用户登录权限; (2)数据输入和输出; (3)数据维护和统计; (4)灵活的信息查询; (5)正确退出系统。 最后,生成一个Web站点。

29

本文来源:https://www.bwwdw.com/article/d517.html

Top