mysql-事务

什么是事务?

事务: transaction 一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败。

  • 事务是保证数据的完整性和一致性的重要手段。
  • DML事务: 由一条或者多条DML语句构成
  • DDL事务: 总是由一条DDL语句构成
  • DCL事务: 总是由一条DCL语句构成

简单来说:办理一件事,背后会有多个操作,这些步骤合起来成为事
务。但步骤有一条错了,那整个事情就是失败,全部成功,那才算成功。

事务的开始和结束

一条sql语句就会开始一个事务

查看事务是否开启?

在这里插入图片描述

注意

在这里插入图片描述

也就是说 DDL DXL语句,MySQL会自动执行,跟变量autocommit是关闭
还是开启没有关系,都会自动提交。

在这里插入图片描述

清晰的事务控制语句流程图

在这里插入图片描述

  • 开始事务:事务开始时,可以执行多个数据库操作,如插入、更新或删除数据。

  • 执行 DELETE 操作:在这个特定的事务中,首先执行了一个删除操作。

  • 设置保存点 A:在删除操作之后,设置了一个保存点A。这样做可以在事务执行过程中,如果需要,可以只回滚到这个点,而不是事务的开始。

  • 执行 INSERT 操作:在设置保存点A之后,进行了数据插入操作。

  • 执行 UPDATE 操作:接下来执行了更新操作。

  • 设置保存点 B:在更新操作之后,设置了第二个保存点B。

  • 执行另一个 INSERT 操作:在保存点B之后,执行了另一个插入操作。

  • 回滚到保存点 B:由于某些原因,需要撤销最后的插入操作,于是事务被回滚到保存点B,这意味着最后的插入操作被撤销,但保存点B之前的操作(包括第一个插入和更新操作)仍然有效。

  • 回滚到保存点 A:接下来,事务又被回滚到保存点A,这意味着回滚到保存点A之后所有的操作都被撤销,只留下第一次的删除操作。

  • 完全回滚事务:最后,整个事务被完全回滚,这意味着所有的操作,包括删除操作,都被撤销,数据库回到了事务开始之前的状态。

演示一下事务过程

root@gh 11:01  mysql>CREATE TABLE players( id INT, NAME VARCHAR(20) );
Query OK, 0 rows affected (0.00 sec)

root@gh 11:02  mysql>START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:02  mysql>INSERT INTO players(id,NAME) VALUES(1,'gh');
Query OK, 1 row affected (0.00 sec)

root@gh 11:03  mysql>INSERT INTO players(id,NAME) VALUES(2,'gf');
Query OK, 1 row affected (0.00 sec)

root@gh 11:03  mysql>SAVEPOINT a;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:04  mysql>update players set NAME='ww' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@gh 11:05  mysql>SAVEPOINT b;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:05  mysql>delete from players where id=2;
Query OK, 1 row affected (0.00 sec)

root@gh 11:05  mysql>select * from players;
+------+------+
| id   | NAME |
+------+------+
|    1 | ww   |
+------+------+
1 row in set (0.00 sec)

root@gh 11:05  mysql>ROLLBACK TO b;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:06  mysql>select * from players;
+------+------+
| id   | NAME |
+------+------+
|    1 | ww   |
|    2 | gf   |
+------+------+
2 rows in set (0.00 sec)

root@gh 11:06  mysql>ROLLBACK TO a;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:06  mysql>select * from players;
+------+------+
| id   | NAME |
+------+------+
|    1 | gh   |
|    2 | gf   |
+------+------+
2 rows in set (0.00 sec)

root@gh 11:06  mysql>ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

root@gh 11:06  mysql>select * from players;
Empty set (0.00 sec)

root@gh 11:06  mysql>

COMMIT 或 ROLLBACK 语句之前的数据的状态

在这里插入图片描述

在这里插入图片描述

并发事务的4个问题

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

详细解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事务有4个特性

  • 原子性(Atomicity):像一个原子一样不可分割。事务中的操作要么全部完成,要么全部不做,就像是你去超市买东西,要么一次买齐所有的东西,要么一样都不买,不能只买一半。

  • 一致性(Consistency):确保数据库从一个正确的状态转移到另一个正确的状态。比如你在银行转账,无论转账成功还是失败,两个账户的总金额应该保持不变。

  • 隔离性(Isolation):事务之间不会互相影响,就像是给每个事务一个独立的房间操作,它们之间互不干扰。

  • 持久性(Durability):一旦事务完成,无论发生什么(比如停电或系统崩溃),结果都会被永久记录下来,就好比你发了一封信,信已经寄出,无论如何都无法撤回。

这四个特性确保了数据库事务的可靠性和稳定性,让数据管理更加安全和高效。

事务的四个隔离级别

在这里插入图片描述

  • 读未提交: 就像是在图书馆里,任何人都可以随时阅读任何书籍,即使别人还没读完放回书架。这意味着你可能看到别人还没完成的笔记或标记。
  • 读已提交: 这就像是你只能看到别人已经读完并放回书架的书。在这个级别上,一旦别人的研究或笔记完成并“提交”了,你才能看到他们的成果。
  • 可重复读: 如果你开始读一本书,直到你读完,别人不能在书上做标记或改动。这样你就可以多次读书而内容不会改变,直到你放回书架。
  • 可串行化: 这是最严格的隔离级别。就像给每个人一个单独的小房间来读书,完全避免了干扰。只有当一个人读完一本书并离开小房间之后,另一个人才能进去,保证了完全的隐私和一致性。

随着隔离级别的提高,数据的准确性和一致性也随之提高,但可能会牺牲一些系统的效率。就像在图书馆里,如果每个人都有一个小房间,那么同时能服务的读者数量就会减少。

在MySQL中查看隔离级别

在这里插入图片描述
在MySQL中(可重复读)REPEATABLE-READ 是默认的隔离级别!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不冤不乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值