美文网首页
事务的创建与使用

事务的创建与使用

作者: 承_风 | 来源:发表于2019-07-28 16:52 被阅读0次
    事务的概念及要求
    • 事务(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
    

    相关文章

      网友评论

          本文标题:事务的创建与使用

          本文链接:https://www.haomeiwen.com/subject/fcdprctx.html