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)

  • 将事务完全隔离,使得它们按顺序执行。
  • 这种隔离级别最高,一致性最好,但性能最低。
相关推荐
工业甲酰苯胺17 分钟前
Redis性能优化的18招
数据库·redis·性能优化
没书读了1 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i2 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl2 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502772 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空2 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
Oak Zhang3 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
聂 可 以4 小时前
Windows环境安装MongoDB
数据库·mongodb
web前端神器4 小时前
mongodb多表查询,五个表查询
数据库·mongodb
门牙咬脆骨4 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存