事务的创建与使用

事务的概念及要求
  • 事务(transaction)是作为单个逻辑工作单元执行的一系列操作。
  • 多个操作作为一个整体向系统提交,要么都执行,要么都不执行。
  • 事务是一个不可再分割的工作逻辑单元。
银行转账过程就是一个事务
  • 它需要两条update语句来完成,这两条语句是一个整体。
  • 如果其中任一条出现错误,则整个转账业务也取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变。
事务的特性
  • 原子性:事务是一个完整的操作,事务的各步操作是不可分割的,要么都执行,要么都不执行。
  • 一致性:当事务完成时,数据必须处于一致状态。
  • 隔离性:并发事务之间彼此隔离、独立,它不应该以任何方式依赖于或影响其他事务。
  • 永久性:事务完成后,它对数据的修改被永久保存。
事务的分类
  • 显式事务:用BEGIN TRANSACTION明确指定事务的开始,最常用的事务类型。
  • 隐性事务:通过设置SET IMPLICIT_TRANSACTION ON语句,将隐性事务模式设置为打开,其后的T-SQL语句自动启动一个新事务。提交或回滚一个事务后,下一个T-SQL语句又将启动一个新事务。
  • 自动提交事务:SQLServer的默认模式;每条单独的T-SQL语句视为一个事务。
使用SQL语句管理事务的基本步骤
--开始事务
BEGIN TRANSACTION
--提交事务
COMMIT TRANSACTION
--回滚(撤销)事务
ROLLBACK TRANSACTION

事务处理的关键问题:对事务中的insert、update、delete语句实时跟踪

判断某条语句执行是否出错的方法
  • 使用全局变量@@ERROR
  • @@ERROR只判断当前一条T-SQL语句执行是否有错
  • 为了判断事务中所有的T-SQL语句是否有错,可以对错误进行累计
use StudentManageDB
go
declare @errorSum int--定义变量,用于累计事务执行中的错误
set @errorSum=0 --初始化为,代表没有错误
begin transaction
    begin
        --转出
        update CardAccount set CurrentMoney-1000 where StudentId=100001
        set @errorSum=@errorSum+@@ERROR
        --转入
        update CardAccount set CurrentMoney+1000 where StudentId=100002
        set @errorSum=@errorSum+@@ERROR --累计是否有错误
        if(@errorSum>0)
            rollback transaction
        else
            commit transaction
    end
go
事务的应用
--编写存储过程,实现学员一卡通转账功能,要求用户输入转入和转出的金额和账户
use StudentManageDB
go
if exists(select * from Sysobjects where name='usp_TransferAccounts')
    drop procedure usp_TransferAccounts
go
create procedure usp_TransferAccounts
@inputAcount int,--转入账户
@outputAccount int, --转出账户
@transferMoney int --交易金额
as
    declare @errorSum int--定义变量,用于累计事务执行中的错误
    set @errorSum=0 --初始化为,代表没有错误
    begin transaction
    begin
        --转出
        update CardAccount set CurrentMoney-@transferMoney where StudentId=@outputAccount
        set @errorSum=@errorSum+@@ERROR
        --转入
        update CardAccount set CurrentMoney+@transferMoney where StudentId=@inputAcount
        set @errorSum=@errorSum+@@ERROR --累计是否有错误
        if(@errorSum>0)
            rollback transaction
        else
            commit transaction
    end
go

你可能感兴趣的:(事务的创建与使用)