第五章 事务和游标
1.事务
事务是由若干条T-SQL指令组成的作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么全部执行完成,要么全部撤销
事务分为显式事务,自动提交事务和隐式事务三种,重点为显式事务
显式事务和另外两个事务不同的是显式事务需要明确定义开始(Begin transaction)和结束(Commit transaction或Rollback transaction)
事务必须具备四个属性,分别是原子性,一致性,隔离性,永久性,简称ACID属性
例,用事务解决银行转账问题:
begin transaction tran_bank (开始一个事务)
declare @tran_error int (定义一个变量用于记录错误 )
set @tran_error=0
update BankInfo set currentMoney=currentMoney-1000
where customerName='张三'
set @tran_error=@tran_error+@@ERROR
update BankInfo set currentMoney=currentMoney+1000
where customerName='李四'
set @tran_error=@tran_error+@@ERROR
if @tran_error<>0 (用if判断,如果错误不等于0则回滚事务取消交易,等于零则交易成功)
begin
rollback transaction
print'转账失败,交易已取消!'
end
else
begin
commit transaction
print'交易成功!'
end
go
2.游标
游标实际上是一种能从多条数据记录的结果及中每次提取记录的几只,有些应用程序不需要对查询得到的整个记录集进行访问,而要其中的一行或者少量的几行数据,或者希望对其进行处理时,就需要用到游标
游标的语法结构:
DECLARE cursor_name 游标名
CURSOR [LOCAL | GLOBAL] 全局或局部的
[FORWARD ONLY | SCROLL] 游标滚动方式
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] 游标读取方式
FOR SELECT_statements 查询语句
[FOR UPDATE [OF Column_name[,….N]]] 可更改字段
游标的使用,例:
declare bank_cursor 声明游标
cursor scroll for select customerName,currentMoney from BankInfo
open bank_cursor 打开游标
declare @name varchar(10),@money money
fetch first from bank_cursor into @name,@money
while @@FETCH_STATUS=0 用while循环遍历游标中的所有数据
begin
print @name+'的余额为'+convert(varchar(10),@money)
fetch next from bank_cursor into @name,@money
end
close bank_cursor 关闭游标
deallocate bank_cursor 释放游标
go