实验八 索引游标及事务
实验七 索引游标及事务
实验八索引、游标和事务一、实验目的1、掌握利用企业管理器和T——SQL语句创建和删除索引的两种方法。
2、了解游标的使用过程3、掌握事务的控制语句二、实验要求1、能认真独立完成实验内容;2、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;三、实训操作及流程分析(一)创建索引了解了索引的用途和特性,下面开始学习如何创建索引。
给一个表创建索引,可以使用企业管理器和CREATE INDEX命令,下面依次学习这两种方法。
1.使用CREATE INDEX命令创建索引。
例8-1 为“Student”数据库中的SC表创建惟一聚集索引,索引键为“CNo”和“SNo”。
1.编写代码:CREATE UNIQUE CLUSTERDE INDEX SC_IX_CNoSNoON SC(SNo,CNo)2..后把该代码放到查询分析器中执行2.使用企业管理器创建索引例8-2在企业管理中,为“Student”数据库中的Student表创建非唯一索引Student_IX_Name,索引键为“Name”。
其操作步骤如下。
1)在创建表结构时,当定义完所有字段后,用鼠标左键单击工具栏中的【管理索引/键】按钮,如图8-1所示(如果给一个现有的表创建索引,则可直接打开表的结构定义窗口,然后用鼠标左键单击工具栏中的【管理索引/键】)图8-1 Student设计表窗口2)当打开【属性】对话框后,用鼠标左键单击【索引/键】选项卡切换到该对话框,如图8-2所示。
在该对话框中用鼠标左键单击【新建】按钮,如图8-3图8-23) 在如图8-3所示的【列名】列表框中,选取索引的键列(本例选择“Name”,并按升序排序),然后在【索引名】文本框中输入索引名称(可使用系统提供的默认名称)图8-34)要用多个字段的组合创建索引(也就是创建多列索引),则依次在【列名】列表框中取各个字段,如图8-4所示,表示要为姓名和学号两字段的组合创建索引。
第8章游标和事务
第十六页,编辑于星期二:二十点 三十四分。
第十七页,编辑于星期二:二十点 三十四分。
第十八页,编辑于星期二:二十点 三十四分。
第十九页,编辑于星期二:二十点 三十四分。
第二十页,编辑于星期二:二十点 三十四分。
第二十一页,编辑于星期二:二十点 三十四分。
第二十二页,编辑于星期二:二十点 三十四分。
第一页,编辑于星期二:二十点 三十四分。
第二页,编辑于星期二:二十点 三十四分。
第三页,编辑于星期二:二十点 三十四分。
第四页,编辑于星期二:二十点 三十四分。
第五页,编辑于星期二:二十点 三十四分七页,编辑于星期二:二十点 三十四分。
第八页,编辑于星期二:二十点 三十四分。
第九页,编辑于星期二:二十点 三十四分。
第十页,编辑于星期二:二十点 三十四分。
第十一页,编辑于星期二:二十点 三十四分。
第十二页,编辑于星期二:二十点 三十四分。
第十三页,编辑于星期二:二十点 三十四分。
第十四页,编辑于星期二:二十点 三十四分。
第十五页,编辑于星期二:二十点 三十四分。
第8章游标事务和锁
2024/8/27
4
SQL Server2005
1.声明游标(DECLARE CURSOR) 可以使用DECLARE 语句声明或创建一个游标。语法格式如
下: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ][;]
UPDATE table_name
SET column_name=expression
WHERE CURRENT OF cursor_name
2024/8/27
10
8.2 事务
SQL Server2005
8.2.1 什么是事务
事务(transaction)是SQL Server 中的单个逻辑工作单元,也是 一个操作序列,它包含了一组数据库操作命令。一个事务内的 所有语句被作为一个整体执行。在事务执行过程中,如果遇到 错误,则可以回滚事务,取消该事务所做的全部改变,从而保 证数据库的一致性和完整性。因此,事务是一个不可分割的工 作逻辑单元,一个事务中的语句要么全部正确执行,要么全部 不起作用。
或 COMMIT WORK 标志一个成功的显示事务或隐性事务的结束。如果没有遇到错误,可使
用该语句成功地结束事务。该事务中的所有数据修改在数据库中都 将永久有效。事务占用的资源将被释放。
2024/8/27
12
实验8:数据库索引和游标试验
实验8:数据库索引和游标试验一、实验目的1 熟悉索引和游标的创建、修改、删除操作。
二、实验内容1在SQL Server Management Studio操作索引,包括创建、修改、删除操作。
三、实验步骤索引1在“对象资源管理器”中展开需要建立索引的表,选中“索引”服务选项并展开。
选中“索引”对象,单击鼠标右键,在快捷菜单中选择“新建索引”选项。
如图1所示:图1进入“新建索引”对话框,设置索引。
选择设置索引的列,索引类型等。
如图2所示:图22 设置完毕,再查询输出,观察输出结果。
3用两种方法完成下列任务:①根据loan表的branch_name列创建一个index_branchname的索引。
第一种方法建立索引:第二种方法建立索引:use bankingcreate unique nonclustered index index_branchname on loan (branch_name)②根据branch表的assets列创建一个名为index_assets的索引。
其中assets按降序。
查看branch表的assets 列显示的结果。
第一种方法建立索引:第二种方法建立索引:use bankingcreate unique nonclustered index index_assets on branch (assets desc)③创建索引视图。
a 创建一个包括贷款用户名、街道信息及贷款号的视图create view [dbo].[view_account]with schemabindingasSELECT account_number, balancefrom dbo.account将视图绑定到基础表的架构。
如果指定了SCHEMABINDING,则不能按照将影响视图定义的方式修改基表或表。
必须首先修改或删除视图定义本身,才能删除将要修改的表的依赖关系.这个视图由WITH SCHEMABINDING选项创建。
事务与游标编程
事务与游标的使用场景与限制
游标的限制 在处理大量数据时性能较差。 可能消耗更多的系统资源。
THANKS
感谢观看
这是最高的隔离级别,它通过强制事务串 行执行,避免了其他并发事务的干扰。
事务的回滚与提交
事务的回滚
当事务中的某些操作失败或被撤销时,需要将该事务所做的所有修改都撤销,回到事务开始时的状态,这个过程 称为回滚。
事务的提交
当事务中的所有操作都成功完成时,需要将该事务所做的所有修改都永久保存到数据库中,这个过程称为提交。
游标的分类
静态游标
01
静态游标在打开时加载整个结果集到内存中,适用于数据量较
小的情况。
动态游标
02
动态游标在打开时只加载查询结果的头部信息,根据需要逐行
读取数据,适用于处理大量数据的情况。
键集游标
03
键集游标是一种特殊类型的动态游标,它通过键值来检索数据
,适用于快速查找和更新数据的情况。
03
CATALOGUE
事务与游标的优缺点比较
• 提高数据安全性:事务可以提供原子性操作,确保数据的 完整性和安全性。
事务与游标的优缺点比较
要点一
性能开销
事务需要维护数据的一致性和完整性,这可能导致性能开 销。
要点二
锁定资源
事务可能需要锁定数据资源,影响并发性能和系统吞吐量 。
事务与游标的优缺点比较
灵活性高
游标允许逐行处理查询结果集,适用 于需要逐行处理数据的场景。
事务的隔离级别
读未提交
读已提交
在这个隔离级别下,一个事务可以读取另 一个未提交的事务的数据。这是最低的隔 离级别。
在这个隔离级别下,一个事务只能读取另 一个已提交的事务的数据。这是大多数数 据库系统的默认隔离级别。
事务与游标编程
事务概述事务处理游标概述游标编程事务与游标的关系编程实践
contents
目录
事务概述
CATALOGUE
01
事务是一系列操作,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
在数据库中,事务通常用于确保数据的完整性和一致性。
原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
事务处理
CATALOGUE
02
最低的隔离级别,允许一个事务读取另一个未提交的事务数据。
读未提交
默认的隔离级别,只允许已提交的事务被其他事务读取。
读已提交
防止不可重复读和幻读,确保在一个事务内多次读取同一数据会看到相同的结果。
可重复读
最高的隔离级别,通过强制事务串行执行,避免了脏读、不可重复读和幻读的问题。
事务可以确保多个操作的整体执行,而游标则主要用于逐行读取和处理数据。
事务通常用于执行一系列相关的在银行转账中,可以将转账操作作为一个事务,确保转账操作的整体执行或全部不执行。
游标则通常用于需要逐行处理数据的情况。例如,在处理大量数据时,可以使用游标逐行读取和处理数据,以提高数据处理效率。
串行化
VS
当事务中的某些操作失败或不符合预期时,可以选择回滚事务,撤销该事务中所做的所有操作。
回滚的操作
通过ROLLBACK语句撤销事务中的所有操作,将数据库恢复到事务开始之前的状态。
回滚的原因
在网络中断、数据库连接丢失等情况下,可能导致事务执行失败。为了确保数据的完整性和一致性,需要重试失败的事务。
关闭游标
释放游标
打开游标会执行SQL语句并返回结果集,然后可以通过循环逐行读取数据。
索引 视图 事务 游标 锁 详细介绍
索引视图游标事务锁1、索引索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
优点:大大加快数据的检索速度;创建唯一性索引,保证数据库表中每一行数据的唯一性;加速表和表之间的连接;在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:索引需要占物理空间占用物理空间过多会影响整个SQL Server性能。
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
建立索引的原则:(1)主键的数据列一定要建立索引,因为主键可以加速定位到表中的某一行。
(2)外键的数据列一定要建立索引,外键列通常用于表与表之间的连接,在其上创建索引可以加快表间的连接速度。
(3)对于经常查询的数据列最好建立索引。
索引的分类普通索引:这是最基本的索引,它没有任何限制唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。
如果是组合索引,则列值的组合必须唯一主键索引(通过主键约束间接创建):它是一种特殊的唯一索引,不允许有空值。
一般是在建表的时候同时创建主键索引组合索引:在表中的多个列上创建的索引。
组合索引中列的顺序是任意的,可以是相邻的列,也可以是不相邻的列。
理解索引:(1)如果经常使用表中的某一列或某几列为条件进行查询,且表中的数据量比较大时,可以创建索引,以提高查询的速度。
(2)索引是与表关联的可选结构。
(3)通过有目的的创建索引,可以加快对表执行SELECT语句的速度。
(4)不管索引是否存在,都无需修改任何SQL语句的书写方式。
索引只是一种快速访问数据的途径,它只影响查询执行的效率。
(5)可以使用CREATE INDEX命令在一列或若干列的组合上创建索引。
(6)创建索引时,将获取要创建索引的列,并对其进行排序。
然后,将一个指针连同每一行的索引值存储起来,组成键值对(目录名和页码)。
第8章 游标事务和锁PPT课件
第8章 游标、事务和锁
2020/11/23
1
SQL Server2005
第8章 游标、事务和锁
1 游标 2 事务 3锁 4 本章小结
2020/11/23rver2005
8.1.1 游标的定义及优点
1.游标的定义
游标能够部分读取返回结果集合中的数据行,并允许应用程序通过 游标来定位修改表中数据。
2.游标的优点
允许定位在结果集的特定行。
从结果集的当前位置检索一行或一部分行。
支持对结果集中当前位置的行进行数据修改。
为由其他用户对显示在结果集中的数据库数据所做的更改提供不 同级别的可见性支持。
提供脚本、存储过程和触发器中用于访问结果集中的数据的 Transact-SQL 语句。
2020/11/23
事务作为一个逻辑工作单元必须具有四个属性:原子性 (Atomicity)、一致性(Consistency)、隔离性(Isolation)和 持久性(Durability)。这四个属性简称ACID属性。
2020/11/23
11
SQL Server2005
1.显示事务 显示事务就是可以显式地定义事务的开始和结束的事务,这类事务又称
为用户定义事务。
(1)BEGIN TRAN [SACTION] [ transaction_name | @tran_name_variable ]
标记一个显式本地事务的起始点。
(2)COMMIT TRAN[SACTION] [ transaction_name | @tran_name_variable ]
2020/11/23
9
SQL Server2005
8.1.3 使用游标修改数据
事务、存储过程、触发器和游标
串行化 (Serializable): 最高的隔离级别,通过强制事务串行执行,避 免了读写和写写的冲突。
02
存储过程
存储过程的定义和优点
定义
减少网络流量
提高性能
安全性
复用性
存储过程是一组为了完 成特定功能的SQL语句 集合,经过编译和存储 在数据库中,用户通过 调用存储过程来执行这 些SQL语句。
VS
详细描述
当需要对查询结果集中的每一行数据进行 操作时,如修改、删除或插入等,可以使 用游标。但是,由于游标会占用大量数据 库资源,性能较低,因此在使用时应谨慎 考虑,尽量避免在大型数据集上使用游标 。同时,还需要注意避免死锁和并发问题 。
感谢您的观看
THANKS
要点二
详细描述
首先,需要声明一个游标变量并设置其属性,如光标类型 、缓冲区大小等。然后,使用OPEN语句打开游标并执行 查询。接下来,使用FETCH语句从结果集中获取数据,并 使用循环结构逐行处理数据。最后,使用CLOSE语句关闭 游标。
游标的使用场景和注意事项
总结词
游标适用于需要逐行处理查询结果集的 场景,但需要注意性能和资源消耗问ommitted): 最低的隔离级别,一个事务可以看 到其他未提交事务的修改。
02
读已提交 (Read Committed): 一个事务只能看到已经提交的事务所 做的修改。
03
可重复读 (Repeatable Read): 在同一事务中多次读取同一数据返回 的结果是一致的。
一致性 (Consistency)
事务必须使数据库从一个一致性状态转变到另一个一致性状态。一致 性是指数据库满足完整性约束。
隔离性 (Isolation)
在事务完成之前,它所做的修改对其他事务是透明的。这意味着并发 执行的事务不会互相干扰。
《数据库原理与应用》11.事务和游标的创建和使用
提取数据
使用FETCH语句从游标中提取 数据,并逐行处理。
释放游标
使用FREE语句释放与游标相关 的资源。
04
事务和游标的应用场景
事务在银行转账中的应用
事务处理
银行转账涉及多个数据库操作,如账户余额的读取、转账金额的扣除和目标账户金额的 增加等。事务确保这些操作要么全部成功,要么全部回滚,保证数据的一致性和完整性。
03
游标的使用
游标的定义
游标
游标是一个数据库对象,用于从结果集中逐行检索数据。它提 供了一种在从数据库检索数据时进行逐行处理的方法。
游标的使用场景
在需要对查询结果集中的数据进行逐行处理时,可以使用游标 。例如,在数据转换、数据更新或数据删除等操作中,需要逐
行读取和处理数据时,可以使用游标。
游标的作用ຫໍສະໝຸດ 05注意事项与常见问题
事务和游标使用时的注意事项
事务的隔离级别
在处理并发操作时,要确保事务的隔离 级别设置得当,以避免数据不一致的问
题。
游标的使用场景
游标主要用于逐行处理查询结果,应 避免在不需要的情况下使用游标,以
提高性能。
事务的边界
确保事务的开始和结束位置明确,避 免出现未提交或已提交的数据修改。
保存点
在事务中设置保存点,可以在事务的执行过程中回滚到某个特定的点,而不是整个事务都回滚。这样 可以减少回滚操作对数据库的影响,提高数据库的并发性能。
保存点
要点一
保存点
在事务中设置保存点,允许在事务执行过程中回滚到某个 特定的点,而不是整个事务都回滚。这样可以减少回滚操 作对数据库的影响,提高数据库的并发性能。
游标允许程序逐行访问结果集中的数据,可以对每一行数据进 行单独的处理或操作。通过游标,可以实现对数据的精细化控
第八章游标、事务和锁
关闭游标
例:显示在一个基于游标的进程中CLOSE 语句的正确位置 . USE pubs GO DECLARE authorcursor CURSOR FOR SELECT au_fname, au_lname FROM authors ORDER BY au_fname, au_lname OPEN authorcursor FETCH NEXT FROM authorcursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM authorcursor END CLOSE authorcursor DEALLOCATE authorcursor GO
对游标的处理过程
DECLARE 游标 OPEN 游标 从一个游标中FETCH 信息 CLOSE 或DEALLOCATE 游标
声明游标
定义游标的滚动行为和用于生成游标 对其进行操作的结果集的查询. 声明一个游标主要包括以下主要内容:
– – – – 游标名字 数据来源(表和列) 选取条件 属性(仅读或可修改)
声明游标
SQL-92语法格式: 语法格式:
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR {READ ONLY | UPDATE [OF column_name [,...n]]}] 其中: – cursor_name 指游标的名字 – INSENSITIVE:表明会将游标定义所选取出来的数据记录存放 在一临时表内(建立在tempdb 数据库下) – SCROLL:表明所有的提取操作,如FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE都可用.如果不使用该保留 字,那么只能进行NEXT 提取操作. – select_statement:是定义结果集的SELECT 语句 – READ ONLY:表明不允许游标内的数据被更新,尽管在缺省状 态下游标是允许更新的. – UPDATE [OF column_name[,…n]]:定义在游标中可被修改的列, 如果不指出要更新的列,那么所有的列都将被更新.
数据库原理与应用课程实验指导书(附答案)
《数据库原理与应用》课程实验指导书苏州工业职业技术学院信息工程系2008.1目录目录 (Ⅰ)前言………………………………………………………………………………………实验一初识SQL Server 2000…………………………………………………实验二数据库的创建和管理…………………………………………………实验三表的创建、管理及数据操作……………………………………………实验四单表查询……………………………………………………………实验五连接查询…………………………………………………………实验六嵌套查询……………………………………………………实验七视图的创建和管理……………………………………………………实验八游标的使用……………………………………………………实验九T-SQL语言编程基础…………………………………………………实验十函数…………………………………………………………………………实验十一索引、默认值约束和默认值对象………………………………实验十二数据完整性的实现…………………………………………………实验十三存储过程…………………………………………………实验十四触发器…………………………………………………实验十五系统安全管理…………………………………………………实验十六数据备份、恢复和导入导出………………………………………实验十七综合训练…………………………………………………前言数据库技术是计算机学科中的一个重要分支,发展迅速、应用非常广泛,几乎涉及了所有应用领域。
例如,办公系统、生产管理、财务管理、人事管理、工业管理等,都广泛应用了数据库技术。
本实验指导书是《数据库原理与应用》课程的配套实验资料。
通过安排实验及布置的任务,让学生熟练掌握使用关系数据库管理系统SQL Server 2000进行数据库及表的创建和管理、查询、Transact—SQL程序设计、各类约束的创建及使用、视图及索引的创建与管理、SQL Server 的存储过程的创建和管理、SQL Server 的触发器创建和管理、SQL Server的安全性管理、数据库的备份及恢复。
视图、索引、存储过程、触发器、游标及事务
视图、索引、存储过程、触发器、游标及事务视图1.视图不占物理存储空间,它只是⼀种逻辑对象。
可将其看成⼀个"虚表"视图是⼀个由select 语句指定,⽤以检索数据库表中某些⾏或列数据的语句存储定义注:创建视图语句中,不能包括order by、compute或者compute by ⼦句,也不能出现into关键字2.创建⽔平视图视图的常见⽤法是限制⽤户只能够存取表中的某些数据⾏,⽤这种⽅法产⽣的视图称为⽔平视图,即表中⾏的⼦集create view student_view1asselect*from studentwhere (class_id='0903')3.创建投影视图如果限制⽤户只能存取表中的部分列的数据,那么,使⽤这种⽅法创建的视图就称为投影视图,即表中列的⼦集create view student_view2asselect student_id as'学号' ,student_name as'姓名',sex as'性别'from studentwhere sex=1with check option/*强制视图上执⾏的所有修改语句必须符合由select 语句设置的准则*/4.创建联合视图⽤户可以⽣成从多个表中提取数据的联合视图,把查询结果表⽰为⼀个单独的"可见表"索引5.索引是数据库的对象之⼀,索引是为了加速对表中数据⾏的检索⽽创建的⼀种分散的⼀种存储结构。
索引是针对⼀个表⽽建⽴的,它是由数据页⾯以外的索引页⾯组成的6.索引的分类聚簇索引数据表的物理顺序和索引表的顺序相同,它根据表中的⼀列或多列值的组合排列记录create unique clustered index book_id_index--惟⼀性聚簇索引on book(book_id asc)withfillfactor=50 /*填充因⼦50%*/⾮聚簇索引create nonclustered index student_course_indexon student_course(student_id asc,course_id asc)withfillfactor=50存储过程存储过程是⼀系列预先编辑好的、能实现特定数据操作功能的SQL代码集。
模块8 游标、事务和锁
任务2 事务
一 、事务的基本概念
并发操作带来的数据不一致性包括四类:丢失修改、脏读、不可重复读取和幻读。 (1)丢失修改 当两个或多个事务选择同一数据,然后基于最初选定的值更新该数据时,会发生丢失 更新问题。由于每个事务都不知道其他事务的存在,最后的更新会重写由其他事务所做的更新,这将导 致数据丢失。 例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的 副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果 我们规定:在第一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问 题。 (2)脏读 当第二个事务选择其他事务正在更新的行时,会发生未提交的依赖关系问题。第二个事务正在读取的数 据还没有提交并且可能由更新此行的事务所更改。 例如,一个编辑人员正在更改电子文档。在更改过程中,另一个编辑人员复制了该文档(该副本包含到 目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错 误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,并且这些编 辑内容应视为从未存在过。如果我们规定:在第一个编辑人员保存最终更改并提交事务之前,任何人都 不能读取更改的文档,则可以避免此问题。
任务1 游标
二 、游标的类型
由于T-SQL游标和API服务器游标都在服务器上实现,所以它们统称为服务器游标。SQL Server 2008支持四种服务器游标类型。 1.只进游标 只进游标(FORWARD ONLY)不支持滚动,它只支持游标从头到尾顺序提取。对所有由当前用户或 其他用户提交并影响结果集中行的INSERT、UPDATE、DELETE语句,其效果在这些行从游标中提 取时是可见的。但是,因为游标不能向后滚动,所以在行被提取后对该行所做的更改,对游标是不 可见的。 2.静态游标 静态游标(STATIC)的完整结果集在游标打开时建立在tempdb系统数据库中。静态游标总是按照游 标打开时的原样显示结果集。任何对该结果集的行产生影响的更改,对该游标都是不可见的。静态 游标始终是只读的,但它支持滚动提取结果集中的行。T-SQL称静态游标为不感知游标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八索引、游标和事务一、实验目的1、掌握利用企业管理器和T——SQL语句创建和删除索引的两种方法。
2、了解游标的使用过程3、掌握事务的控制语句二、实验要求1、能认真独立完成实验内容;2、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;三、实训操作及流程分析前三项内容参看实验七(四)事务的使用所谓事务(Transaction ),是指一个操作序列,这些操作序列要么都被执行,要么都不被执行,它是一个不可分割的工作单元。
对事务进行管理的语句有如下几句:语句: begin transaction开始一个事务语句: commit transaction完成一个事务(提交)语句:rollback transaction取消一个事务(退回)例8-4:将课程号为001的全部记录改为课程号为22begin tranupdate course set Cno=22 where Cno=001if @@error<>0beginrollback tranprint '修改课程表失败'endelsebeginupdate SC set Cno=22 where Cno=001if @@error<>0beginrollback tranprint '修改成绩单失败'endelsebegincommit tranprint '修改成功'endend(提示:关于@@ERROR全局变量的解释,如果最后的Transact-SQL 语句执行成功,则@@ERROR 系统函数返回0;如果此语句产生错误,则@@ERROR 返回错误号。
也就意味着,每一个Transact-SQL 语句完成时,@@ERROR 的值都会改变。
)其实例8-4的事务的上述写法还有一定问题,既是course表中先修课程号cpno还没有做相应修改,所以应完成的代码如下:begin tranupdate course set Cno='22' where Cno='0001'if @@error<>0beginrollback tranprint '修改课程表失败'endelsebeginupdate Course set Cpno='22' where Cpno='0001'if @@error<>0beginrollback tranprint '修改课程表失败'endelsebeginupdate SC set Cno='22' where Cno='0001'if @@error<>0beginrollback tranprint '修改成绩表失败'endelsebegincommit tranprint '修改成功'endendend例8-5银行业务数据库bankdb,其中,帐户信息表(bank)存放帐户的信息,交易信息表(transInfo)存放每次的交易信息。
试用事务解决银行转帐问题张三转账200元给李四分析:在bank表中需要完成的操作为两处,张三的当前金额减200;李四的当前金额加200在transInfo表中需要完成的操作为两处,插入cardID为10010001的一条支取200的记录插入cardID为10010001的一条存入200的记录代码如下:begin tranupdate bank set CurrentMoney = CurrentMoney-200 Where CardID='10010001'if @@error<>0rollback tranelsebeginupdate bank set CurrentMoney = CurrentMoney+200 Where CardID='10010002'if @@error<>0rollback tranelsebeginInsert into transInfo Values('10010001',getdate(),'支取',200)if @@error<>0rollback tranelsebeginInsert into transInfo Values('10010002',getdate(),'存入',200)if @@error<>0rollback tranelsebegincommit tranprint '交易成功'endendendend当一个用户的金额减少时需要注意不能使得金额为负,则需要当金额为负时回滚此操作,代码如下:begin tranupdate bank set CurrentMoney = CurrentMoney-2000 Where CardID='10010001'declare @num moneyselect @num=CurrentMoney From bank where CardID='10010001'if @num<0beginrollback tranprint '钱数为负!'endelsebegincommit tranprint '修改成功!'end四、练习1、编写一个事务,更改学号为“2010011243”的学生的学号为“2010011244”2、编写一个事务,银行转账交易,李四转账给张三100元五、创建与执行存储过程(1)用T-SQL语句创建存储过程可以使用CREATE PROCEDURE语句来创建存储过程。
例8.1在学生成绩库中创建一个名为sp_StuCourseInfo的存储过程,产生一个学生选课情况列表,其中包括学号、姓名、性别、课程号、课程名、成绩、学分等。
分析:要产生一个学生选课情况列表,包含学号、姓名、性别、课程号、课程名、成绩、学分等字段信息,其Select语句如下:SELECT tStudent.Sno as 学号, name as 姓名, age as 性别, o as 课程号, Cname as 课程名, Grade as 成绩, Ccredit as 学分FROM Student, SC, CourseWHERE Student.Sno = SC.Sno AND o = o那么,完整的创建存储过程proc_8_2的T-SQL语句如下:CREATE PROCEDURE sp_StuCourseInfoASSELECT tStudent.Sno as 学号, name as 姓名, age as 性别, o as 课程号, Cname as 课程名, Grade as 成绩, Ccredit as 学分FROM Student, SC, CourseWHERE Student.Sno = SC.Sno AND o = oGO上述T-SQL语句执行后,在学生成绩库中就存在了名为sp_StuCourseInfo的存储过程。
(2)用企业管理器创建存储过程例8.2用企业管理器实现例8.2所述存储过程的创建。
具体操作如下:●打开企业管理器,展开服务器组,展开服务器,展开“数据库”文件夹。
再展开“学生成绩库”,右击“存储过程”,如图1 用企业管理器创建存储过程。
●单击“新建存储过程”命令,见图2新建存储过程过程窗口。
●在该窗口的文本框中,编写存储过程的语句。
如图3编写存储过程语句。
●单击“确定”命令。
可以看到在企业管理器中,已存在名为proc_8_3的存储过程。
图1 用企业管理器创建存储过程图2 新建存储过程窗口图3 编写存储过程语句存储过程创建后,可以通过在查询分析器的查询窗口中键入存储过程名来执行,也可以使用EXECUTE语句来执行存储过程。
练习在学生成绩库中创建存储过程sp_Credit4Course,要求实现如下功能:产生学分为’4’的课程学生选课情况列表,其中包括课程号、课程名、学分、学号、姓名、系别、性别等。
并调用此存储过程,显示执行结果。
六、事务并发问题(附加)在数据库中,假设如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。
并发问题包括:●丢失或覆盖更新。
●未确认的相关性(脏读)。
●不一致的分析(非重复读)。
●幻像读。
1、丢失更新当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。
每个事务都不知道其它事务的存在。
最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
2、未确认的相关性(脏读)当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。
第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。
3、不一致的分析(非重复读)当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。
不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。
然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。
而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
4、幻像读当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。
事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。
同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
上述四个问题都会引起数据的不一致性。
我们把事务准备接受不一致数据的级别称为隔离级别。
隔离级别是一个事务必须与其它事务进行隔离的程度。
较低的隔离级别可以增加并发,但代价是降低数据的正确性。
相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
SQL Server 支持四个隔离级别:●READ UNCOMMITTED---未提交读(事务隔离的最低级别,仅可保证不读取物理损坏的数据)。
●READ COMMITTED---提交读(SQL Server 默认级别)。
●REPEATABLE READ---可重复读。
●SERIALIZABLE---可串行读(事务隔离的最高级别,事务之间完全隔离)。
(1)丢失更新的再现在Sql查询分析其中打开一个连接,输入如下数据:begin tranupdate student set Age=20 where sno='2005011243'waitfor delay '00:00:10'commit tran接着在Sql查询分析器中再打开一个连接(文件菜单——连接),输入如下数据:begin tranupdate student set Age=22 where sno='2005011243'commit tran观察一下第二个连接的执行时间,得到如下结论第二个连接里面的事务不能立刻执行,必须等待第一连接的事务完成之后才能执行下去。