什么是事务?老生常谈:事务是逻辑上的一组操作,要么都执行,要么都不执行
经典实例:转账给你,我减少100,你增加100,不能因为系统故障导致,我钱转出了,而你没收到
事务的四大特性
- A:原子性,最小执行单位,要么都执行,要么都不执行
- C:一致性,?
- I:隔离性,并发访问数据库是,两个事务是独立的,
- D:持久性
# 表定义
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) DEFAULT NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 初始数据MySQL> select * from student;+----+----------+---------------------+| id | name| create_time|+----+----------+---------------------+|1 | Jarry| 2020-08-13 09:14:01 ||2 | Hameimei | 2020-08-13 09:14:09 |+----+----------+---------------------+2 rows in set (0.00 sec)
事务并发可能发生的情况a. 脏读一个事务读到另一个事务未提交的事务文章插图
session_2在session_1读期间改了数据后,又回退了事务,导致session_1读的数据根本不存在
脏读只在读未提交隔离级别才出现b. 不可重复读
文章插图
一个事务中,可以读到另一个事务已经提交的数据
不可重复读在读未提交、读已提交隔离级别都可能出现c. 幻读
文章插图
一个事务查询某个条件查出记录,之后别的事务对数据进行插入,那么第一个事务再用同样的条件查询时得到的结果和一开始的到的结果不一致
不可重复读在读未提交、读已提交、可重复读隔离级别都可能出现两者区别?对于前者, 只需要锁住满足条件的记录
对于后者, 要锁住满足条件及其相近的记录
不可重复读重点在于update和delete,而幻读的重点在于insert
事务的隔离级别Mysql事务隔离级别有4个:读未提交、读已提交、可重复读、可串行化
# 读未提交
文章插图
# 读已提交
文章插图
#可重复读
文章插图
session_2 读 session_1 发生变更提交,并且自己也提交后才可以读到session_1的变更
可以解决脏读、不可重复度,但是不能解决幻读问题
#可重复读
文章插图
四种级别比较
文章插图
【Mysql事务隔离级别】
推荐阅读
- MySQL主从不一致情形与解决方法
- MySQL INSERT 有哪4种形态?
- MYSQL主主模式 LNMP 独立部署配置指导书
- MySQL的隐式转化
- MySQL的备份与恢复
- MySQL索引怎么用?究竟能有多快?看完这篇你就懂了
- 多场景下MySQL临时表有什么用?
- MySQL两地三中心方案初步设计
- 100% 展示 MySQL 语句执行的神器-Optimizer Trace
- MySQL,合理的使用索引结构和查询