文章目录
- 📚引言
- 📖事务
- 📑事务的概念
- 📑事务操作
- 🔖查看与设置事务提交方式
- 🔖提交事务与回滚事务
- 📑事务的特性
- 📑并发事务问题
- 📑事务隔离级别
- 📍总结
📚引言
🙋♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,亚太数学建模国家二等奖🏅。
✍️研究方向:复杂网络科学
🏆兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。
事务是一组操作的集合,其会把所有的操作作为一个整体提交或者撤销。
在本文中,我们将会对SQL中的事务进行介绍与演示,话不多说,我们开始吧。
📖事务
📑事务的概念
为了更好的了解事务的概念,我们看下面这个例子。
假设A要给B转账100元,此时我们需要进行如下三个操作:
- 查询A的账户余额
- A账户余额-100
- B账户余额+100
而这种操作必须一次性完成,如果整个操作中途出现了问题那么就应该立即回滚,停止所有的账户操作。
如果上述操作没有停止,那么将会导致有不可与预知的错误。
SQL中也支持这种将很多操作集中在一起的方式就是事务,接下来我们看事务的操作。
📑事务操作
🔖查看与设置事务提交方式
在SQL中默认事务时自动提交的,所以当我们编写SQL的语句时,默认其就是一个事务。我们可以通过语句来查询事务的提交方式并修改它,代码如下:
SELECT @@AUTOCOMMIT;
可以看到,默认的提交方式为1,也就是自动提交。
特别的,我们可以对其进行修改为手动提交,代码如下:
SET @@AUTOCOMMIT = 0;
🔖提交事务与回滚事务
在更改为手动提交事务后,我们就需要手动的通过命令来进行事务的提交与回滚,代码如下:
# 提交事务
COMMIT;
# 回滚事务
ROLLBACK;
接下来,我们就进行事务提交与回滚的演示。首先我们建立一个账户余额表并为其添加两条数据,代码如下:
CREATE TABLE MONEY(
NAME VARCHAR(10) NOT NULL,
MONEY INT DEFAULT 0
);
INSERT INTO MONEY (NAME,MONEY) VALUES('TOM',1000),('JANE',1000);
结果如下:
假设我们需要把TOM的余额修改为2000,此时我们在控制台1进行下面的操作:
update money set money = 2000 where name = 'TOM';
在我们查询表中的值的时候出现了下面的结果,可是我们真的修改成功了吗?
这时我们打开控制台2,继续查询上述相同的内容结果如下:
显然,我们刚才修改的结果还没有真正上传到数据库,而是在控制台1中执行了。此时我们就需要COMMIT;
来完成控制台1的事务。
此时我们在控制台1中COMMIT提交我们的事务,这就能够在控制台2查询到我们的修改了。
另外,我们也可以不使用SET @@AUTOCOMMIT
设定事务状态,可以使用下面的开启事务代码代替:
# 开启事务
START TRANSACTION;
# 提交事务
COMMIT;
# 回滚事务
ROLLBACK;
下面我们就利用上述的代码来示范一下事务回滚,假设还是上述相同的情况,这次我们希望需要把JANE的余额修改为2000。为了演示方便,我们将在两个控制台中演示上述操作:
可以看到,我们在左边的控制台1进行了更新操作,而控制台2还没有收到更新操作,这是因为我们在控制台1中开启了事务。与此同时,鸡舍我们想要放弃上述的操作而取消事务的进行,可以使用ROLLBACK
进行回滚,这样不会对数据库中的数据有任何影响。
📑事务的特性
- 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性:事务完成时,必须使所有的数据都保持一致状态。
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
📑并发事务问题
- 脏读:个事务读到另外一个事务还没有提交的数据 。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。
📑事务隔离级别
为了处理上述的并发事务级别,我们可以对事务进行事务级别的更改,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内容我也将持续更新,如果感兴趣的话不妨订阅本专栏或者点个关注,我们下次再见。