MySQL 事务是什么?四大特性介绍

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观

事务(Transaction)是 MySQL 中用于保证一组操作的完整性和一致性的机制。在多用户并发环境中,事务可以有效地解决数据一致性问题,确保数据库的稳定运行。

什么是事务?

事务是由一组 SQL 操作组成的逻辑单元,这些操作要么全部成功,要么全部失败。 事务的核心目标是保证数据的完整性和一致性。

事务的特性(ACID)

  1. 原子性(Atomicity) :
    事务中的所有操作被视为一个整体,要么全部执行成功,要么全部撤销。

  2. 一致性(Consistency)
    事务的执行不会破坏数据库的完整性约束。

  3. 隔离性(Isolation)
    并发执行的事务互不干扰,一个事务的中间状态对其他事务不可见。

  4. 持久性(Durability)
    事务提交后,其结果将永久保存到数据库中,即使系统崩溃也不会丢失。

MySQL 中事务的支持

在 MySQL 中,只有支持事务的存储引擎(如 InnoDB)才能使用事务功能。 非事务型存储引擎(如 MyISAM)不支持事务。

事务的基本语法

-- 开始事务
START TRANSACTION;

-- 执行SQL操作
INSERT INTO 表名 VALUES (...);
UPDATE 表名 SET ... WHERE ...;
DELETE FROM 表名 WHERE ...;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

示例:银行转账

假设用户 A 给用户 B 转账 500 元,需要以下两个操作:

  1. 从用户 A 的账户扣减 500 元。
  2. 向用户 B 的账户增加 500 元。

为了保证操作的完整性,使用事务:

START TRANSACTION;

-- 从用户 A 扣减 500 元
UPDATE t_account 
SET balance = balance - 500 
WHERE user_id = 1;

-- 向用户 B 增加 500 元
UPDATE t_account 
SET balance = balance + 500 
WHERE user_id = 2;

-- 提交事务
COMMIT;

如果某一步操作失败,则回滚整个事务:

START TRANSACTION;

UPDATE t_account 
SET balance = balance - 500 
WHERE user_id = 1;

-- 模拟出错
-- UPDATE t_account SET 错误的操作

-- 回滚事务
ROLLBACK;

自动提交模式

MySQL 默认使用自动提交模式,每执行一条 SQL 语句都会自动提交。 可以通过以下命令关闭自动提交模式:

SET autocommit = 0;

要重新开启自动提交:

SET autocommit = 1;

回滚点(Savepoint)

使用回滚点可以在事务中部分回滚,而不是回滚整个事务。

示例:

START TRANSACTION;

INSERT INTO t_student VALUES (1, 'Alice');
SAVEPOINT sp1;

INSERT INTO t_student VALUES (2, 'Bob');
ROLLBACK TO sp1; -- 回滚到 savepoint

COMMIT; -- 提交剩余操作

注意事项

  1. 事务引擎
    确保使用支持事务的存储引擎(如 InnoDB)。

  2. 锁问题
    长时间持有事务可能导致锁等待甚至死锁。

  3. 性能影响
    事务会影响并发性能,在设计时需权衡一致性与性能。

小结

MySQL 的事务机制为数据库操作提供了数据一致性保障。熟练掌握事务操作和隔离级别的设置,可以有效应对复杂的数据一致性问题。

通过合理设计事务,开发者可以更好地平衡数据的完整性与系统性能。