1. 数据并发问题
MySQL是一个客户端/服务器
架构的软件,可以有若干个客户端与之连接,连接上之后,就可以称之为一个会话(Session
),对于服务器来说可能同时处理多个Session
,也就是对服务器来说可能同时处理多个事务。但是由于事务的隔离性,理论上如果多个事务有对同一个表中的数据进行的操作,他们的执行顺序应该按照事务到达的顺序进行排队
(也叫序列化),但是这样对性能影响太大,比如SessionA,SessionB,SessionC都提交了一个事务,事务到达的顺序为A -> C -> B
:
对比上面的图片我们发现虽然序列化可以满足事务的隔离性问题,但是对性能影响太大
,难道就没有什么两全其美的方法吗?在解决问题之前,我们得先明白同时处理多个Session
时可能会出现一系列并发问题,具体总结为以下几种:
- 脏写
- 脏读
- 不可重复读
- 幻读
创建一个表tb_student
,数据如下:
下面我将根据该表数据进行通过举例+说明的方式进行解释。
1.1 脏写(Dirty Write)
脏写示意图:
执行次序 | Session A | Session B |
---|---|---|
1 | 事务开始 | |
2 | 事务开始 | |
3 | UPDATE tb_student SET name = ‘lisi’ WHERE stu_id = 1 | |
4 |