第五章总结

版权声明:sktyasuo https://blog.csdn.net/sktyasuo/article/details/82623187

1事务特点

原子,隔离,一致,永久

    /*--转帐测试:张三转账1000元给李四--*/
        --我们可能会这样这样编写语句
        --张三的帐户少1000元,李四的帐户多1000元
        UPDATE bank SET currentMoney = currentMoney - 1000 WHERE customerName = '张三'
        UPDATE bank SET currentMoney = currentMoney + 1000 WHERE customerName = '李四'
        GO

        --再次查看转帐后的结果。
        SELECT * FROM bank
        GO

    /*--使用事务进行解决--*/
        --开始一个事务
        BEGIN TRANSACTION tran_bank    --也可简写为begin tran tran_bank
        --定义一个用于记录错误的变量
        DECLARE  @tran_error INT
        SET @tran_error = 0
        --在张三的账户减去
        UPDATE bank SET currentMoney = currentMoney - 10000 WHERE customerName = '张三'
        SET @tran_error = @tran_error + @@error
        --在李四的账户增加
        UPDATE bank SET currentMoney = currentMoney + 10000 WHERE customerName = '李四'
        SET @tran_error = @tran_error + @@error
        IF @tran_error <> 0
            BEGIN
                --执行出错,回滚事务
                ROLLBACK TRANSACTION
                PRINT '转账失账,交易已取消'
            END
        ELSE
            BEGIN
                --没有发现错误,提交事务
                COMMIT TRANSACTION
                PRINT '交易成功,已保存新数据'
            END
        GO
            
        --再次查看转帐后的结果。
        SELECT * FROM bank
        GO

--1.声明游标
            DECLARE bank_cursor
            CURSOR LOCAL
            scroll
            FOR SELECT * FROM bank
            --FOR SELECT customerName,currentMoney FROM bank  --获取部分列

--2.打开该游标
            OPEN bank_cursor

  --3.读取游标
            --定义个变量,用于存放游标中读取出来的值
            DEClARE @id int
            DECLARE @name CHAR(10)
            DECLARE @money MONEY
            --读取游标的第一条记录行,并存放在变量中
            FETCH first FROM bank_cursor INTO @id,@name,@money
            --循环读取游标中的记录
            PRINT '读取的数据如下:'
            WHILE (@@fetch_status = 0)
            BEGIN
                --用print输出读取的数据
                PRINT '账户名:' + @name + '    余额:' +  convert(VARCHAR,@money)
                --update bank set currentMoney = currentMoney+1000 where customerId = @id
                --读取下一条记录行
                FETCH next FROM bank_cursor INTO @id,@name,@money
            END

--4.读取完成后关闭游标
            CLOSE bank_cursor

--5.释放游标
            DEALLOCATE bank_cursor

猜你喜欢

转载自blog.csdn.net/sktyasuo/article/details/82623187