第八章 游标,事务和锁 |
declare stu_cursor scroll cursor for
select 姓名 from 学生信息1
declare @name varchar(20)
open stu_cursor
fetch last from stu_cursor into @name
fetch absolute 2 from stu_cursor into @name
print @name
open stu_cursor --打开游标
close stu_cursor --关闭游标
deallocate stu_cursor --释放游标
判断游标提取数据是否成功
@@fetch_status 下列三种情况
0 fetch语句成功
-1 fetch 语句失败或行不在结果集中
·2 提取的行不存在
事务
概念:当多个用户同时对数据进行操作时,可能出现问题,这时候就需要用到事务,事务一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。
例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
在sql server 2008系统中主要使用下列4条语句
Begin transaction 开始事务
Commit transaction 提交事务或者结束事务
Rollback transaction 回滚事务
Save transaction 保存事务
事务模式
1.自动提交事务:每条单独的语句都是一个事务,例如update语句,insert语句
2.显示事务:每个事务均已begin transaction语句显示开始,以commint 或rollback语句显示结束
3.隐式事务:在前一个事务完成时新事务隐式启动,但每个事务仍以commit或rollback语句显示完成
4.批处理级事务:只能应用于多个活动结果集(MARS),在MARS会话中启动的T-sql显式或隐式事务变成批处理级事务,当批处理完成时没有提交或回滚的批处理级事务自动右sql server进行回滚
锁
概念:所谓锁,就是一个事务可以向系统提出请求,对被操作的数据加锁(lock)。其它事务必须等到此事务解锁(unlock)之后才能访问该数据。从而,在多个用户并发访问数据库时,确保不互相干扰。可锁定的单位是:行,页,表,盘区和数据库。
锁的类型:
1.共享锁(s):用于读操作
多个事务可封锁一个共享单位的数据
任何事务都不能修改加s锁的数据
通常是加s锁的数据被读取完毕,s锁立即被释放
2.独占锁(X):用于写操作
仅允许一个事务封锁此共享数据
其他任何事务必须等到x锁被释放才能对该数据进行访问
X锁一直到事务结束时才能被释放
3.更新(U)锁
用来预定要对此页加X锁,它允许其他事务读,但不允许施加U锁或者X锁。
当被读取数据页要被更新时,则升级为X锁
U锁一直等到事务结束时才能被释放
死锁:执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。
比如:如果线程A锁住了记录1并等待记录2.而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。