简单概述 事务与游标
事务
3
一个事务可以被定义为作为工作的单个的逻辑单元被一起执行的一串的操作。
3
单个的工作单元必须具有称为ACID(原子性,一致性,独立性,和持久性)的四个性质
ä
原子性
ä
一致性
ä
独立性
ä
*
为实现ACID性质的需求,SQL Servr提供了下面的特性:
3
事务管理
3
上锁
3
*
事务日志-是SQL Server管理所有它的的事务而维护的日志
*
*
BEGIN TRANSACTION:该语句标志显示事务的开始
3
语法
BEGIN TRAN[SACTION] [transaction_name |
@tran_name_variable]
*
COMMIT TRANSACTION或 COMMIT WORK:语句标志显式事务的结束点
3
语法
*
Autocommit事务
3
autocommit模式是SQL Server的缺省事务管理模式
*
结果:
3
事务的使用可以避免数据的不一致性
3
*
ROLLBACK TRANSACTION或 ROLLBACK WORK:这些语句把显式的或隐式的事务回滚到事务的开始,或者回滚到事务内的保存点
3
语法
ROLLBACK [TRAN[SACTION] [transaction_name
|@tran_name_variable |savepoint_name |
@savepoint_variable]]
@savepoint_variable]]
*
结果
3
事务可用ROLLBACK TRANSACTION语句回复
*
保存事务
3
它在事务内设置保存点 。保存点把事务分成几个逻辑单元,这样事务可以返回到保存点,如果事务的一部分是有条件地被取消。
3
语法
SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable}
*
结果
3
事务可以用SAVE TRANSACTION语句分解成几个逻辑单元
*
事务的并发性
3
SQL Server提供了乐观的和悲观的并发性控件
3
乐观并发性控件
ä
建立在多用户间资源冲突大概是不可能的假设的基础上
ä
允许事务执行不用锁定任何资源
ä
3
悲观并发性控件
ä
并发性问题
3
丢失更新
ä
3
自由依赖性
ä
3
不一致性分析
ä
3
幻象读取
ä
幻象读取又称为作幻象问题
*
锁项- SQL Server 可对以下资源上锁:
3
RID
3
Key
3
Page
3
Extent
3
Table
3
*
SQL Server锁模型
3
共享锁
ä
允许并发事务来读取资源
3
更新锁
ä
避免了常见形式的死琐发生
3
互斥型锁
ä
意向锁
ä
指示SQL Server要在层次结构较低的某个资源上获得一个共享或排它锁
3
模式锁
ä
死锁
*
设置死锁优选级
3
为探测死锁的情况,SQL Server扫描在等待锁请求的会话
3
SQL Server提供SET DEADLOCK_PRIORITY命令来定制死锁
3
语法
SET DEADLOCK_PRIORITY {LOW|NORMAL|@deadlock_var}
定制LOCK_TIMEOUT
3
SET LOCK_TIMEOUT命令可被用来设置等待被阻塞资源语句的最长时间
游标
*
游标是一个在给定结果集中帮助访问和操纵数据的数据库对象
*
游标能以下列方式处理结果集中的行:
3
允许从结果集中检索指定的行
3
允许结果集中当前行被修改
3
帮助从结果集中当前行导航到不同的行
3
当在SQL Server中使用游标时,需要执行下面任务:
3
需要定义游标和设置的它的属性。
3
需要打开游标。
3
所需的行要从游标取得。
3
如果需要的话,游标的当前行中的数据可被修改的。
3
需要关闭游标。
3
游标应解除分配。这是一个很好的习惯由于游标所用的资源被释放。
*
声明游标
3
你可以用DECLARE CURSOR语句来定义游标和它的特性集
3
语法
DECLARE cursor_name [INSENSITIVE] [SCROLL]
CURSOR FOR {
select_statement
}
[FOR {READ ONLY | UPDATE [OF column_list]}]
[FOR {READ ONLY | UPDATE [OF column_list]}]
*
打开游标
3
你可以用OPEN语句打开前面声明过的游标
3
语法
*
取数据
3
3
语法
FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n]] FROM cursor_name[ INTO @variable_name [ ,...n ] ]
在打开一个游标后,你可以从游标的结果集中检索指定行。SQL Server 2000提供FETCH语句来完成这项任务。
*
关闭游标
3
为了释放被游标持有的资源你必须关闭游标。游标可以用CLOSE语句关闭。
3
Syntax
CLOSE cursor_name
*
解除分配游标
3
你可以抹去由DECLARE游标语句定义的游标的定义
3
语法
DEALLOCATE cursor_name