- 备战2022春招或暑期实习,本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。
- 本篇总结的是 《MySQL之事务详述》,后续会每日更新~
- 关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客
- 相信自己,越活越坚强,活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!

目录
一、简介
在MySQL中事务是一个绕不开的话题。事务是一组操作的集合,它是一个不可分割的工作单位,事务可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
在MySQL中并不是所有的存储引擎都支持事务,MyISAM和InnoDB是MySQL最常使用的引擎,MyISAM不支持事务,InnoDB支持事务。
在目前常用的MySQL版本中,事务默认是自动提交的,也就是说在执行完一条DML语句之后,MySQL会隐式的提交事务,执行commit操作。
二、事务操作
在交易系统中,涉及金额的操作往往程序员十分谨慎,而这里是少不了事务的,因此这里用交易为例,演示事务操作。
2.1 错误案例
李子柒向李子捌转账
准备数据
use liziba;
drop table if exists account;
create table account
(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) character set utf8 comment '姓名',
money double(10, 2) comment '余额'
) character set utf8 comment '账户表';
insert into account(name, money)
VALUES ('李子捌', 20000),
('李子柒', 20000);
无事务无异常情况下
-- 查询姓名为李子柒的账户余额
select a.money from account a where a.name = '李子柒';
-- 李子柒账户转出10000
update account a set a.money = (a.money - 10000) where a.name = '李子柒';
-- 李子捌账户转入10000
update account a set a.money = (a.money + 10000) where a.name = '李子捌';
此时表中数据保持一致

无事务出现异常情况
select a.money from account a where a.name = '李子柒';
-- 李子柒账户转出10000
update account a set a.money = (a.money - 10000) wher

本文深入探讨MySQL事务,包括事务的基本概念、操作、四大特性(原子性、一致性、隔离性、持久性)以及在并发情况下可能出现的脏读、不可重复读和幻读问题,并分析了不同事务隔离级别的解决方案。
最低0.47元/天 解锁文章
1016

被折叠的 条评论
为什么被折叠?



