一天学会MySQL数据库(13):事务

最近在学习数据库,寻找教程中,苦于视频长度几十个小时,没有沉下心去看,发现一个六小时长度的mysql教程,发现还不错,学习并记录学习笔记。
资源地址在最下方。
本篇文章,作为学习笔记可配套学习!

作用:

在 MySQL 中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
通俗来说:就是要么全部完成,要么全不完成!

例如:
比如我们的银行转账:

-- a -> -100
UPDATE user set money = money - 100 WHERE name = 'a';

-- b -> +100
UPDATE user set money = money + 100 WHERE name = 'b';

在实际项目中,假设只有一条 SQL 语句执行成功,而另外一条执行失败了,就会出现数据前后不一致。

因此,在执行多条有关联 SQL 语句时,事务可能会要求这些 SQL 语句要么同时执行成功,要么就都执行失败。

如何控制事务 - COMMIT / ROLLBACK

在 MySQL 中,事务的自动提交状态默认是开启的。
@@AUTOCOMMIT为1,即为开启状态。

-- 查询事务的自动提交状态
SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
|            1 |
+--------------+

自动提交的作用:

当我们执行一条 SQL 语句的时候,其产生的效果就会立即体现出来,且不能回滚。
什么是回滚?举个例子:

CREATE DATABASE bank;

USE bank;

CREATE TABLE user (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    money INT
);

INSERT INTO user VALUES (1, 'a', 1000);

SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

可以看到,在执行插入语句后数据立刻生效,原因是 MySQL 中的事务自动将它提交到了数据库中。那么所谓回滚的意思就是,撤销执行过的所有 SQL 语句,使其回滚到最后一次提交数据时的状态。

在 MySQL 中使用 ROLLBACK 执行回滚:

-- 回滚到最后一次提交
ROLLBACK;

SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

由于所有执行过的 SQL 语句都已经被提交过了,所以数据并没有发生回滚。那如何让数据可以发生回滚?

-- 关闭自动提交
SET AUTOCOMMIT = 0;

-- 查询自动提交状态
SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
|            0 |
+--------------+

将自动提交关闭后,测试数据回滚:

INSERT INTO user VALUES (2, 'b', 1000);

-- 关闭 AUTOCOMMIT 后,数据的变化是在一张虚拟的临时数据表中展示,
-- 发生变化的数据并没有真正插入到数据表中。
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+

-- 数据表中的真实数据其实还是:
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

-- 由于数据还没有真正提交,可以使用回滚
ROLLBACK;

-- 再次查询
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+

手动提交

那如何将虚拟的数据真正提交到数据库中?使用 COMMIT :

INSERT INTO user VALUES (2, 'b', 1000);
-- 手动提交数据(持久性),
-- 将数据真正提交到数据库中,执行后不能再回滚提交过的数据。
COMMIT;

-- 提交后测试回滚
ROLLBACK;

-- 再次查询(回滚无效了)
SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+

总结

自动提交

查看自动提交状态:SELECT @@AUTOCOMMIT ;

设置自动提交状态:SET AUTOCOMMIT = 0 。

手动提交

@@AUTOCOMMIT = 0 时,使用 COMMIT 命令提交事务。

事务回滚

@@AUTOCOMMIT = 0 时,使用 ROLLBACK 命令回滚事务。

事务的实际应用

让我们再回到银行转账项目:

-- 转账
UPDATE user set money = money - 100 WHERE name = 'a';

-- 到账
UPDATE user set money = money + 100 WHERE name = 'b';

SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+

这时假设在转账时发生了意外,就可以使用 ROLLBACK 回滚到最后一次提交的状态:

-- 假设转账发生了意外,需要回滚。
ROLLBACK;

SELECT * FROM user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+

这时我们又回到了发生意外之前的状态,也就是说,事务给我们提供了一个可以反悔的机会。假设数据没有发生意外,这时可以手动将数据真正提交到数据表中:COMMIT 。

视频资源:

《一天学会MySQL数据库》
https://www.bilibili.com/video/BV1Vt411z7wy?p=21

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python 中,我们可以使用 PyMySQL 模块来连接和操作 MySQL 数据库。要创建 MySQL 数据库,可以按照以下步骤: 1. 首先,需要使用 pip 安装 PyMySQL 模块。可以在终端或命令提示符中运行以下命令来安装 PyMySQL: ``` pip install PyMySQL ``` 2. 在 Python 中,可以使用 pymysql 模块中的 connect() 函数来连接 MySQL 数据库。连接 MySQL 数据库需要指定 MySQL 服务器的主机名、端口号、用户名、密码和数据库名。可以按照以下方式连接 MySQL 数据库: ```python import pymysql # 连接 MySQL 数据库 conn = pymysql.connect( host='localhost', port=3306, user='root', password='123456', database='test_db' ) ``` 其中,host 表示 MySQL 服务器的主机名,port 表示 MySQL 服务器的端口号,user 表示 MySQL 用户名,password 表示 MySQL 密码,database 表示要连接的 MySQL 数据库名。 3. 连接 MySQL 数据库后,可以使用 pymysql 模块中的 cursor() 方法创建一个游标对象。游标对象可以用来执行 SQL 查询和更新操作。可以按照以下方式创建游标对象: ```python # 创建游标对象 cursor = conn.cursor() ``` 4. 创建 MySQL 数据库需要执行 SQL 语句。可以使用游标对象的 execute() 方法来执行 SQL 语句。可以按照以下方式创建 MySQL 数据库: ```python # 创建 MySQL 数据库 sql = "CREATE DATABASE test_db" cursor.execute(sql) ``` 其中,sql 表示要执行的 SQL 语句。 5. 执行完 SQL 语句后,需要使用 commit() 方法提交事务。可以按照以下方式提交事务: ```python # 提交事务 conn.commit() ``` 6. 最后,需要关闭游标对象和数据库连接。可以按照以下方式关闭游标对象和数据库连接: ```python # 关闭游标对象和数据库连接 cursor.close() conn.close() ``` 完整的代码示例: ```python import pymysql # 连接 MySQL 数据库 conn = pymysql.connect( host='localhost', port=3306, user='root', password='123456', database='test_db' ) # 创建游标对象 cursor = conn.cursor() # 创建 MySQL 数据库 sql = "CREATE DATABASE test_db" cursor.execute(sql) # 提交事务 conn.commit() # 关闭游标对象和数据库连接 cursor.close() conn.close() ``` 注意:在执行 CREATE DATABASE 语句时,需要确保 MySQL 用户具有创建数据库的权限。如果没有权限,可以使用 root 用户登录到 MySQL 服务器,并使用以下命令授予用户权限: ```sql GRANT CREATE ON *.* TO 'user'@'host'; ``` 其中,user 表示 MySQL 用户名,host 表示 MySQL 服务器的主机名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值