第 10讲事务与游标编程问题
问题在银行等重要交易中,要使一组 SQL语句同时执行或撤消,
如何做?
要对查询结果进行一行行的操作,如何做到?
事务概述
事务是作为单个逻辑工作单元执行 的一系列操作。
思考:事务和批处理的区别?
事务的属性 ( ACID)
原子性:原子工作单元
一致性:保证数据的一致性
隔离性:并发事务之间所做的修改要隔离
并发操作:几个用户程序同时读写一个数据的情况
持久性:对系统的影响要持久简单事务编程
格式:
1,BEGIN TRANSACTION
2,COMMIT TRANSACTION
3,ROLLBACK TRANSACTION
【 问题 】 简单的事务提交和回滚
说明:如果没有明确给出
BEGIN TRANSACTION语句,
则 SQL Server是将每个 SQL语句都当成一个事务进行执行事务的嵌套
嵌套事务只有在提交了最外层的事务后,数据才执行永久修改
嵌套事务时,ROLLBACK语句只能将所有内层事务回滚到最外层的 BEGIN TRANSACTION
语句封锁
利用封锁技术可以有效地保证数据的一致性
封锁粒度:可以锁定在行、
列、表、数据库等不同的单元上
SQL Server具有自动和强制封锁的功能锁模式
锁模式:
1,共享锁( Share Lock)
2,排他锁( Exclusive Lock)
3,更新锁( Update Lock)
各种锁模式的兼容性:
共享锁 更新锁 排他锁共享锁 YES YES NO
更新锁 YES NO NO
排他锁 NO NO NO
死锁
当两个事务 trans1和 trans2在下列的状态时,将产生死锁:
1,Trans1:存取数据项 X和 Y
2,Trans2:存取数据项 Y和 X
【 说明 】 如果事务 Trans1封锁了数据项 X,事务 Trans2封锁了数据项 Y,则 Trans1等待 Trans2释放 Y上的锁,Trans2等待 Trans1
释放 X上的锁。因此,Trans1和
Trans2都无限地等待对方打开锁住的数据项,则产生死锁。
死锁
(
续
)
【 死锁示例 】
说明,SQL Server能自动发现并解除死锁
避免死锁的措施,P.237
游标引例以前:使用 SELECT语句对表格进行查询,
返回的结果集包括所有满足条件的行。
思考:如果要求每次只显示表格(例如上面的 Course表)中的一行,该如何处理? —— 这在将 T-SQL嵌入到其他高级语言(如 C,VC,Delphi等)的编程中经常用到。
游标概述
可以将游标看作一种特殊的指针,它可以指向与它相关联的结果集中的任意一行,
以便对当前位置的行进行处理。
游标提供了对一个结果集进行逐行处理的能力:
1,在结果集中定位特定行
2,从结果集的当前位置检索行
3,支持对结果集中当前位置的行进行数据处理(修改 /删除)
使用游标的步骤
声明游标
打开游标
处理数据(读取 /修改 /删除) —
— 可以和其他 T-SQL语句配合灵活使用
关闭游标(与打开游标配对)
删除游标(与声明游标配对,此时释放分配给游标的所有资源)
【 问题 】 游标基本使用的例子相关语法格式
声明游标
DECLARE cursor_name CURSOR
[FORWORD_ONLY|SCROLL]
FOR select_statements
打开游标
OPEN cursor_name
使用游标
FETCH [NEXT|PRIOR|FIRST|LAST]
FROM cursor Into @variable_name
关闭游标
CLOSE cursor_name
删除游标
DEALLOCATION cursor_name
练习
1
1,声明一个名为 CrsStudent的游标,使其与,00电子商务班”
的所有学生信息(学号、姓名)相关联,并逐行显示前三条学生信息如果遍历整个结果集
?
使用 @@fetch_status:
该全局变量 /配置函数返回被最后 FETCH语句执行的游标的状态,
返回类型为 int:
1,0,FETCH语句成功
2,- 1:FETCH语句失败或此行不在结果集中
3,- 2:被提取的行不存在练习
2
使用游标遍历 Course表,输出报名人数最多的课程的信息
(课程编码、课程名称、报名人数)
练习
3
建立一个存储过程,利用游标求 course表中某系(用户给定系代码)所开课程的最大报名人数,并把课程名称和最大报名人数作为输出变量返回给用户。
本章小结
事务 —— 掌握
锁 —— 了解
重点:
掌握 事务和 游标的使用步骤、方法
问题在银行等重要交易中,要使一组 SQL语句同时执行或撤消,
如何做?
要对查询结果进行一行行的操作,如何做到?
事务概述
事务是作为单个逻辑工作单元执行 的一系列操作。
思考:事务和批处理的区别?
事务的属性 ( ACID)
原子性:原子工作单元
一致性:保证数据的一致性
隔离性:并发事务之间所做的修改要隔离
并发操作:几个用户程序同时读写一个数据的情况
持久性:对系统的影响要持久简单事务编程
格式:
1,BEGIN TRANSACTION
2,COMMIT TRANSACTION
3,ROLLBACK TRANSACTION
【 问题 】 简单的事务提交和回滚
说明:如果没有明确给出
BEGIN TRANSACTION语句,
则 SQL Server是将每个 SQL语句都当成一个事务进行执行事务的嵌套
嵌套事务只有在提交了最外层的事务后,数据才执行永久修改
嵌套事务时,ROLLBACK语句只能将所有内层事务回滚到最外层的 BEGIN TRANSACTION
语句封锁
利用封锁技术可以有效地保证数据的一致性
封锁粒度:可以锁定在行、
列、表、数据库等不同的单元上
SQL Server具有自动和强制封锁的功能锁模式
锁模式:
1,共享锁( Share Lock)
2,排他锁( Exclusive Lock)
3,更新锁( Update Lock)
各种锁模式的兼容性:
共享锁 更新锁 排他锁共享锁 YES YES NO
更新锁 YES NO NO
排他锁 NO NO NO
死锁
当两个事务 trans1和 trans2在下列的状态时,将产生死锁:
1,Trans1:存取数据项 X和 Y
2,Trans2:存取数据项 Y和 X
【 说明 】 如果事务 Trans1封锁了数据项 X,事务 Trans2封锁了数据项 Y,则 Trans1等待 Trans2释放 Y上的锁,Trans2等待 Trans1
释放 X上的锁。因此,Trans1和
Trans2都无限地等待对方打开锁住的数据项,则产生死锁。
死锁
(
续
)
【 死锁示例 】
说明,SQL Server能自动发现并解除死锁
避免死锁的措施,P.237
游标引例以前:使用 SELECT语句对表格进行查询,
返回的结果集包括所有满足条件的行。
思考:如果要求每次只显示表格(例如上面的 Course表)中的一行,该如何处理? —— 这在将 T-SQL嵌入到其他高级语言(如 C,VC,Delphi等)的编程中经常用到。
游标概述
可以将游标看作一种特殊的指针,它可以指向与它相关联的结果集中的任意一行,
以便对当前位置的行进行处理。
游标提供了对一个结果集进行逐行处理的能力:
1,在结果集中定位特定行
2,从结果集的当前位置检索行
3,支持对结果集中当前位置的行进行数据处理(修改 /删除)
使用游标的步骤
声明游标
打开游标
处理数据(读取 /修改 /删除) —
— 可以和其他 T-SQL语句配合灵活使用
关闭游标(与打开游标配对)
删除游标(与声明游标配对,此时释放分配给游标的所有资源)
【 问题 】 游标基本使用的例子相关语法格式
声明游标
DECLARE cursor_name CURSOR
[FORWORD_ONLY|SCROLL]
FOR select_statements
打开游标
OPEN cursor_name
使用游标
FETCH [NEXT|PRIOR|FIRST|LAST]
FROM cursor Into @variable_name
关闭游标
CLOSE cursor_name
删除游标
DEALLOCATION cursor_name
练习
1
1,声明一个名为 CrsStudent的游标,使其与,00电子商务班”
的所有学生信息(学号、姓名)相关联,并逐行显示前三条学生信息如果遍历整个结果集
?
使用 @@fetch_status:
该全局变量 /配置函数返回被最后 FETCH语句执行的游标的状态,
返回类型为 int:
1,0,FETCH语句成功
2,- 1:FETCH语句失败或此行不在结果集中
3,- 2:被提取的行不存在练习
2
使用游标遍历 Course表,输出报名人数最多的课程的信息
(课程编码、课程名称、报名人数)
练习
3
建立一个存储过程,利用游标求 course表中某系(用户给定系代码)所开课程的最大报名人数,并把课程名称和最大报名人数作为输出变量返回给用户。
本章小结
事务 —— 掌握
锁 —— 了解
重点:
掌握 事务和 游标的使用步骤、方法