什么是事务?
老生常谈:事务是逻辑上的一组操作,要么都执行,要么都不执行
经典实例:转账给你,我减少100,你增加100,不能因为系统故障导致,我钱转出了,而你没收到
事务的四大特性
- A:原子性,最小执行单位,要么都执行,要么都不执行
- C:一致性,?
- I:隔离性,并发访问数据库是,两个事务是独立的,
- D:持久性
串行执行是不会事务执行很顺畅,但当不同事务同时执行时可能出现各种情况,以student表为例
# 表定义
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的变更
可以解决脏读、不可重复度,但是不能解决幻读问题
#可重复读
四种级别比较