【建议收藏】数据库 SQL 入门——事务(内附演示)

请添加图片描述

文章目录

  • 引言
  • 事务
    • 事务的概念
    • 事务操作
      • 查看与设置事务提交方式
      • 提交事务与回滚事务
    • 事务的特性
    • 并发事务问题
    • 事务隔离级别
  • 总结

引言

‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读‍,曾获得华为杯数学建模国家二等奖,MathorCup 数学建模竞赛国家二等奖,亚太数学建模国家二等奖。

✍️研究方向:复杂网络科学

兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。

事务是一组操作的集合,其会把所有的操作作为一个整体提交或者撤销。

在本文中,我们将会对SQL中的事务进行介绍与演示,话不多说,我们开始吧。

事务

事务的概念

为了更好的了解事务的概念,我们看下面这个例子。

假设A要给B转账100元,此时我们需要进行如下三个操作:

  • 查询A的账户余额
  • A账户余额-100
  • B账户余额+100

而这种操作必须一次性完成,如果整个操作中途出现了问题那么就应该立即回滚,停止所有的账户操作。

如果上述操作没有停止,那么将会导致有不可与预知的错误。
【建议收藏】数据库 SQL 入门——事务(内附演示)_第1张图片
SQL中也支持这种将很多操作集中在一起的方式就是事务,接下来我们看事务的操作。

事务操作

查看与设置事务提交方式

在SQL中默认事务时自动提交的,所以当我们编写SQL的语句时,默认其就是一个事务。我们可以通过语句来查询事务的提交方式并修改它,代码如下:

SELECT @@AUTOCOMMIT;

【建议收藏】数据库 SQL 入门——事务(内附演示)_第2张图片
可以看到,默认的提交方式为1,也就是自动提交。

特别的,我们可以对其进行修改为手动提交,代码如下:

SET @@AUTOCOMMIT = 0;

【建议收藏】数据库 SQL 入门——事务(内附演示)_第3张图片

提交事务与回滚事务

在更改为手动提交事务后,我们就需要手动的通过命令来进行事务的提交与回滚,代码如下:

# 提交事务
COMMIT;
# 回滚事务
ROLLBACK;

接下来,我们就进行事务提交与回滚的演示。首先我们建立一个账户余额表并为其添加两条数据,代码如下:

CREATE TABLE MONEY(
NAME VARCHAR(10) NOT NULL,
MONEY INT DEFAULT 0
);

INSERT INTO MONEY (NAME,MONEY) VALUES('TOM',1000),('JANE',1000);

结果如下:
【建议收藏】数据库 SQL 入门——事务(内附演示)_第4张图片
假设我们需要把TOM的余额修改为2000,此时我们在控制台1进行下面的操作:

update money set money = 2000 where name = 'TOM';

在我们查询表中的值的时候出现了下面的结果,可是我们真的修改成功了吗?
【建议收藏】数据库 SQL 入门——事务(内附演示)_第5张图片
这时我们打开控制台2,继续查询上述相同的内容结果如下:
【建议收藏】数据库 SQL 入门——事务(内附演示)_第6张图片
显然,我们刚才修改的结果还没有真正上传到数据库,而是在控制台1中执行了。此时我们就需要COMMIT;来完成控制台1的事务。

此时我们在控制台1中COMMIT提交我们的事务,这就能够在控制台2查询到我们的修改了。

【建议收藏】数据库 SQL 入门——事务(内附演示)_第7张图片
另外,我们也可以不使用SET @@AUTOCOMMIT设定事务状态,可以使用下面的开启事务代码代替:

# 开启事务
START TRANSACTION;
# 提交事务
COMMIT;
# 回滚事务
ROLLBACK;

下面我们就利用上述的代码来示范一下事务回滚,假设还是上述相同的情况,这次我们希望需要把JANE的余额修改为2000。为了演示方便,我们将在两个控制台中演示上述操作:
【建议收藏】数据库 SQL 入门——事务(内附演示)_第8张图片
可以看到,我们在左边的控制台1进行了更新操作,而控制台2还没有收到更新操作,这是因为我们在控制台1中开启了事务。与此同时,鸡舍我们想要放弃上述的操作而取消事务的进行,可以使用ROLLBACK进行回滚,这样不会对数据库中的数据有任何影响。

【建议收藏】数据库 SQL 入门——事务(内附演示)_第9张图片

事务的特性

  • 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性:事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题

  • 脏读:个事务读到另外一个事务还没有提交的数据 。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。

事务隔离级别

为了处理上述的并发事务级别,我们可以对事务进行事务级别的更改,SQL中的事务隔离级别种类如下所示:

隔离级别 脏读 不可重复读 幻读
Read uncommitted —— —— ——
Read committed —— —— 解决
Repeatable Read(默认) —— 解决 解决
Serializable 解决 解决 解决

我们可以下面的代码查看事务隔离级别或者设置事务隔离级别:

# 查看事务隔离级别
SELECT @@TRANSACTION ISOLATION
# 设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL  {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}

总结

本次列举了SQL中常用事务相关语句,在实际学习的过程中还需要多学习以及使用才能熟练掌握。

余下的SQL内容我也将持续更新,如果感兴趣的话不妨订阅本专栏或者点个关注,我们下次再见。

你可能感兴趣的:(#,SQL入门语句速查手册,数据库,sql)