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)

  • 将事务完全隔离,使得它们按顺序执行。
  • 这种隔离级别最高,一致性最好,但性能最低。
相关推荐
技术宝哥2 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸3 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1234 小时前
Redis解析
数据库·redis·缓存
数据库幼崽4 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd4 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou5 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh5 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵6 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多7 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆7 小时前
MySQL——1、数据库基础
数据库·adb