MySQL 事务是什么?四大特性介绍
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
事务(Transaction)是 MySQL 中用于保证一组操作的完整性和一致性的机制。在多用户并发环境中,事务可以有效地解决数据一致性问题,确保数据库的稳定运行。
什么是事务?
事务是由一组 SQL 操作组成的逻辑单元,这些操作要么全部成功,要么全部失败。 事务的核心目标是保证数据的完整性和一致性。
事务的特性(ACID)
-
原子性(Atomicity) :
事务中的所有操作被视为一个整体,要么全部执行成功,要么全部撤销。 -
一致性(Consistency)
事务的执行不会破坏数据库的完整性约束。 -
隔离性(Isolation)
并发执行的事务互不干扰,一个事务的中间状态对其他事务不可见。 -
持久性(Durability)
事务提交后,其结果将永久保存到数据库中,即使系统崩溃也不会丢失。
MySQL 中事务的支持
在 MySQL 中,只有支持事务的存储引擎(如 InnoDB)才能使用事务功能。 非事务型存储引擎(如 MyISAM)不支持事务。
事务的基本语法
-- 开始事务
START TRANSACTION;
-- 执行SQL操作
INSERT INTO 表名 VALUES (...);
UPDATE 表名 SET ... WHERE ...;
DELETE FROM 表名 WHERE ...;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
示例:银行转账
假设用户 A 给用户 B 转账 500 元,需要以下两个操作:
- 从用户 A 的账户扣减 500 元。
- 向用户 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; -- 提交剩余操作
注意事项
-
事务引擎
确保使用支持事务的存储引擎(如 InnoDB)。 -
锁问题
长时间持有事务可能导致锁等待甚至死锁。 -
性能影响
事务会影响并发性能,在设计时需权衡一致性与性能。
小结
MySQL 的事务机制为数据库操作提供了数据一致性保障。熟练掌握事务操作和隔离级别的设置,可以有效应对复杂的数据一致性问题。
通过合理设计事务,开发者可以更好地平衡数据的完整性与系统性能。