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