MySql事务

目录

一、事务的四大特性(ACID)

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

持久性(Durability)

二、事务的状态

三、事务的使用

显式事务

隐式事务

四、事务的隔离级别

[读未提交(READ UNCOMMITTED)](#读未提交(READ UNCOMMITTED))

[读已提交(READ COMMITTED)](#读已提交(READ COMMITTED))

[可重复读(REPEATABLE READ)](#可重复读(REPEATABLE READ))

串行化(SERIALIZABLE)


MySQL事务是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作要么全部成功,要么全部失败,从而维护数据库的完整性和一致性。以下是对MySQL事务的详细解析:

一、事务的四大特性(ACID)

原子性(Atomicity)

  • 原子性是指事务是一个不可分割的工作单位,事务内的操作要么全部成功,要么全部回滚。
  • 在MySQL中,使用BEGIN、COMMIT和ROLLBACK等语句来控制事务的边界,保证事务的原子性。

一致性(Consistency)

  • 一致性是指事务执行前后,数据库的状态必须保持一致。
  • 在MySQL中,通过事务的隔离级别和锁机制来保证事务的一致性。

隔离性(Isolation)

  • 隔离性是指并发执行的事务之间相互隔离,每个事务都感觉不到其他事务的存在。
  • MySQL支持多个隔离级别,如读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE),可以根据需求选择合适的隔离级别。

持久性(Durability)

  • 持久性是指一旦事务提交,其所做的修改将永久保存在数据库中,即使发生系统故障或数据库重启也不会丢失。
  • MySQL通过事务日志(redo log)和回滚日志(undo log)来实现持久性。redo log记录的是已经成功提交的事务操作信息,用来恢复数据,保证事务的持久性;undo log记录的是事务修改之前的数据信息,用来回滚数据,保证事务的原子性。

二、事务的状态

  1. 活动(Active):事务进入活动状态表示它已经开始,但尚未完成。这是事务的起始状态。
  2. 部分提交(Partially Committed):事务执行了所有的SQL语句,但尚未提交。在这个状态下,事务对数据库所做的修改已被写入事务日志,但尚未应用到数据库中。
  3. 已提交(Committed):事务已经成功完成并已提交。在这个状态下,事务对数据库所做的修改已经永久保存在数据库中,成为数据库的一部分。
  4. 失败(Failed):事务执行过程中发生了一个错误,导致事务无法继续执行。在这个状态下,通常会选择回滚事务,将数据库恢复到事务开始前的状态。
  5. 中止(Aborted):事务被中止,可能是由于发生错误导致的回滚,也可能是由于应用程序显式地中止了事务。
  6. 挂起(Suspended):事务处于一个暂时的挂起状态,等待某些条件满足后再继续执行。这通常与事务隔离级别相关,例如,在并发控制中等待其他事务释放锁。

三、事务的使用

使用事务有两种方式,分别为显式事务和隐式事务。

显式事务

  • 手动启动:明确地使用START TRANSACTION或者BEGIN语句来显式地启动一个事务。这表示从这一点开始,所有的数据库操作将作为一个事务进行处理。
  • 手动提交或回滚:在事务执行结束后,需要明确地使用COMMIT提交事务,或者使用ROLLBACK回滚事务。这使得开发者有更精确的控制,可以根据业务逻辑决定是否提交或回滚事务。

隐式事务

  • 自动启动:在默认情况下,每个SQL语句都被视为一个事务。这意味着在执行SQL语句时,会自动启动一个事务。
  • 自动提交:在隐式事务中,每个SQL语句执行后都会自动提交事务,除非显式地使用SET AUTOCOMMIT=0关闭自动提交,这时需要使用COMMIT或ROLLBACK手动处理事务。

四、事务的隔离级别

读未提交(READ UNCOMMITTED)

  • 允许脏读,即允许一个事务看到其他事务未提交的修改。
  • 这种隔离级别最低,性能最高,但一致性最差。

读已提交(READ COMMITTED)

  • 只允许一个事务看到其他事务已经提交的修改。
  • 这种隔离级别可以防止脏读,但不能防止不可重复读和幻读。

可重复读(REPEATABLE READ)

  • 确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果。
  • 这种隔离级别可以防止脏读和不可重复读,但不能完全防止幻读(在某些数据库系统中,如MySQL的InnoDB引擎,通过间隙锁等技术可以进一步防止幻读)。这是MySQL的默认事务级别。

串行化(SERIALIZABLE)

  • 将事务完全隔离,使得它们按顺序执行。
  • 这种隔离级别最高,一致性最好,但性能最低。
相关推荐
原机小子5 分钟前
城镇保障性住房管理:SpringBoot系统解决方案
数据库·spring boot·php
shiran小坚果9 分钟前
AWS RDS MySQL内存使用
数据库·mysql·云计算·database·aws
SelectDB17 分钟前
8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
大数据·数据库·数据分析
kali-Myon1 小时前
NewStarCTF2024-Week5-Web&Misc-WP
前端·python·学习·mysql·web安全·php·web
刘艳兵的学习博客1 小时前
刘艳兵-DBA027-在Oracle数据库,通常可以使用如下方法来得到目标SQL的执行计划,那么通过下列哪些方法得到的执行计划有可能是不准确的?
数据库·oracle·面试·database·刘艳兵
weixin_537590451 小时前
《MySQL 8 DBA基础教程》第三章习题答案
数据库·mysql
十二同学啊1 小时前
Mybatis拦截器中获取@RequestBody表单的值修改查询SQL
数据库·sql·mybatis
The博宇2 小时前
网易SQL面试题
数据库·sql
幺零九零零2 小时前
【Golang】sql.Null* 类型使用(处理空值和零值)
数据库·sql·golang
qq_429856572 小时前
达梦数据库 安装以及初始化
数据库