数据库(31)——事务

事务

数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一组逻辑操作单元,这些操作要么全部成功执行,要么全部不执行,以保持数据的一致性和完整性。事务是确保数据可靠性的重要机制之一,特别是在多用户并发访问数据库的情况下。

在MySQL中,事务(Transaction)是一组要么全部执行成功,要么全部不执行的SQL语句集合。事务的主要目的是确保数据的一致性和完整性,即使在出现错误或系统崩溃的情况下也能保护数据不受损害。

开启事务

BEGIN;

START TRANSACTION;

结束事务

结束事务分为提交和回滚

提交:COMMIT;

回滚:ROLLBACK;


演示

在初始表demo中只有一个数据

接下来使用START TRANSACTION;开启事务,并对数据库进行操作:

然后尝试使用rollback回滚,回滚后再次查询:

可以发现前面3条插入语句都被rollback撤销了,这会将数据库恢复到事务开始之前的状态。

接下来使用begin重新开启事务,并插入两条数据:

使用select语句查询:

可以发现尽管没有提交事务,但是查询数据时仍然能查到数据。

原因是MySQL使用的是InnoDB存储引擎 ,而InnoDB的默认隔离级别是REPEATABLE READ(可重复读)。

什么是隔离级别?

隔离级别

事务隔离级别是指一个事务与其他事务隔离的程度。在数据库系统中,多个事务可能会并发执行,而这些事务之间可能会相互干扰。事务隔离级别就是用来解决这种并发问题的一种机制,它规定了事务在并发执行时的行为。

SQL标准定义了四种事务隔离级别,它们分别是:

  1. 读未提交(Read Uncommitted)

    • 允许事务读取另一个事务还未提交的更改。

    • 可能导致脏读、不可重复读和幻读。

    • 在MySQL的InnoDB存储引擎中,实际上并不支持真正的读未提交隔离级别,而是会将其提升为读已提交。

  2. 读已提交(Read Committed)

    • 确保事务只能读取另一个事务已经提交的更改。

    • 避免脏读,但可能导致不可重复读和幻读。

    • 在这个级别下,每次读取都会获取数据的最新状态。

  3. 可重复读(Repeatable Read)

    • 确保在同一个事务中多次读取同一数据时,结果一致。

    • 避免脏读和不可重复读,但可能导致幻读。

    • 这是MySQL InnoDB存储引擎的默认隔离级别。

    • 在这个级别下,事务开始时建立的数据快照在整个事务期间都是可见的。

  4. 串行化(Serializable)

    • 确保事务完全串行化执行,即事务一个接一个地按顺序执行。

    • 避免脏读、不可重复读和幻读。

    • 提供最高的事务隔离级别,但并发性能最低。


在可重复读的级别下,可以看到自己事务开始时的数据状态,对于在事务内的更改依然可以通过select语句查询到,因为InnoDB允许事务内的一直性读取。

接下来提交事务:

提交事务后,数据已经成功的在数据库表上修改。

使用事务的主要好处在于它能够确保数据的一致性和完整性,同时提高系统的可靠性和稳定性。当发生故障时,也能及时的使用回滚进行恢复。

相关推荐
Hello.Reader1 小时前
Redis 延迟监控深度指南
数据库·redis·缓存
ybq195133454311 小时前
Redis-主从复制-分布式系统
java·数据库·redis
好奇的菜鸟4 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
tan180°4 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
满昕欢喜4 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver
Hello.Reader6 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
简佐义的博客7 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法7 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
老纪的技术唠嗑局9 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
阿里云大数据AI技术10 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm