SQL研习录(30)——事务基础详解及示例


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、事务

1、基础知识

  事务(transaction),一般是指要做的或所做的事情,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),也就是由多个sql语句组成,必须作为一个整体执行,例如,有一天小王要给小张转一千块钱,那么银行首先要从小王的账号上扣除一千,然后再给小张的账号添加以前的数据,例如下面有一张模拟银行的表,代码如下:

CREATE TABLE bank(
	name varchar(50) NOT NULL PRIMARY KEY,
	money int
)

INSERT INTO bank (name,money) VALUES ('小王',999);
INSERT INTO bank (name,money) VALUES ('小张',100);

  查询这张表,显示结果如下:
在这里插入图片描述
  并且给money列添加约束,令它最小不能超过十元,作为卡费保存,如下:
在这里插入图片描述
  现在,我们可以知道小王在银行存有999元,小张在银行存有100元,并且卡内的钱数不能少于十元,现在如果小王要给小张转账1000元注定是不能成功的,这是我们的预想,现在我们来试着执行一下转账的代码,看看结果怎么样,代码如下:

UPDATE bank SET money=money-1000 WHERE name='小王';
UPDATE bank SET money=money+1000 WHERE name='小张';

  执行结果如下:
在这里插入图片描述
  可以看出来,由于检查约束,第一行是没有执行成功的,但是却有一行代码是执行成功的,这是怎么回事呢?我们来查一下表内的数据看看最终的结果吧,如下:
在这里插入图片描述
  可以看出来,小王的钱由于代码未执行成功而没有减少,但是小张的钱却多出来由一百块加到了一千一百元,凭空多出来了一千元,要是转账都是这样的情况的话,博主就天天去转账了,哈哈,显然这样是不合理的,那么这时候我们就需要事务来解决问题了,那么事务有什么特性呢?我们需要了解一下事务的特性及基本操作为我们打好基础再来利用事务解决这个问题

2、事务的ACID特性

  1、原子性(Atomic)
  事务必须是原子工作单元,对于其数据修改,要么全部执行,要么全都不执行
  2、一致性(Consistent)
  事务在完成时,必须使所有的数据都保持一致状态,在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的
  3、隔离性(Isolated)
  由开发事务所做的修改必须与任何其他并发事务所作的修改隔离,事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据,这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同
  4、持久性(Durable)
  事务完成之后,它对于系统的影响是永久性的,该修改即使出现系统故障也将一直保持

3、事务的基本操作

  打开一个事务

begin transaction

  回滚事务

rollback

  提交事务

commit

4、示例的解决

  现在我们就利用我们所学到的事务来解决上面示例中所遇到的问题,代码及释义如下:

-- 开启一个事物
BEGIN TRANSACTION
-- 声明一个变量用来存储@@ERROR的值
DECLARE @sum int=0
-- 执行第一条代码
UPDATE bank SET money=money-1000 WHERE name='小王';
-- 将@@ERROR的值存储到@sum中
SET @sum=@sum+@@ERROR
-- 执行第二条代码
UPDATE bank SET money=money+1000 WHERE name='小张';
-- 将@@ERROR的值存储到@sum中
SET @sum=@sum+@@ERROR
-- 如果@sum不为0,说明有错误的语句
IF @sum<>0
BEGIN
	-- 回滚事务
	rollback
END
ELSE
BEGIN
	-- 否则(也就是没有错误的语句),提交事务
	commit
END

  现在我们来执行这段代码后看看结果:
在这里插入图片描述
  转账没有成功,问题已解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值