CREATE TABLE bank
(
customerName CHAR(10), --顾客姓名
currentMoney MONEY --当前余额
)
GO
ALTER TABLE bank
ADD CONSTRAINT CK_currentMoney
CHECK(currentMoney >= 1)
GO
INSERT INTO bank(customerName, currentMoney)
VALUES('张三', 1000)
INSERT INTO bank(customerName, currentMoney)
VALUES('李四', 1)
--模拟转账过程
DECLARE @zhangmoney DECIMAL(8,2)
DECLARE @liMoney DECIMAL(8,2)
PRINT '转账前:'
SELECT @zhangMoney=currentMoney FROM bank
WHERE customerName='张三'
SELECT @liMoney=currentMoney FROM bank
WHERE customerName='李四'
PRINT '张三余额:'+CAST(@zhangMoney AS VARCHAR(10))
PRINT '李四余额:'+CAST(@liMoney AS VARCHAR(10))
PRINT '开始转账.........'
--声明一个事务
BEGIN TRANSACTION
DECLARE @errorSum INT
SET @errorSum=0
--操作1 扣掉张三1000块
UPDATE bank SET currentMoney-=500
WHERE customerName='张三'
SET @errorSum+=@@ERROR
--操作2 给李四加上1000块
UPDATE bank SET currentMoney+=500
WHERE customerName='李四'
SET @errorSum+=@@ERROR
IF(@errorSum=0)
BEGIN
--没有出错
COMMIT TRANSACTION --提交事务 保存下来
PRINT '转账成功'
END
ELSE
BEGIN
--出错了
ROLLBACK TRANSACTION --回滚事务 还原
PRINT '转账失败'
END
PRINT '转账结束'
PRINT '转账后:'
SELECT @zhangMoney=currentMoney FROM bank
WHERE customerName='张三'
SELECT @liMoney=currentMoney FROM bank
WHERE customerName='李四'
PRINT '张三余额:'+CAST(@zhangMoney AS VARCHAR(10))
PRINT '李四余额:'+CAST(@liMoney AS VARCHAR(10))