数据库(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允许事务内的一直性读取。

接下来提交事务:

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

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

相关推荐
无忧无虑Coding24 分钟前
Django入门教程——数据模型建立
数据库·django·sqlite
MXsoft61840 分钟前
监控易监测对象及指标之:Canal中间件监控
大数据·数据库
知识中的海王44 分钟前
已解决sqlalchemy.exc.OperationalError: (pymssql._pymssql.OperationalError) (18456
数据库·python
2401_858120261 小时前
SpringBoot框架:闲一品交易平台的创新驱动
数据库·spring boot·oracle
CopyLower2 小时前
Redis 分布式锁:原理、实现及最佳实践
数据库·redis·分布式
尘浮生2 小时前
Java项目实战II基于微信小程序的计算机实验室排课与查询系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·小程序
2301_80220193关注我2 小时前
Parameters参数、增删改标签、事务、typeAliases
java·数据库·windows
夜间出没的AGUI3 小时前
zjy-sqlite-manage使用文档v1
数据库·oracle