搞懂数据库-Mysql事务
搞懂数据库-Mysql事务
1.什么是事务
事务(Transaction)是并发控制的基本单位。它是一个操作序列,这些操作要么都执行,要么都不执行。例如,转账业务,转和收两个操作要么都执行,只要有一方出现问题就都不执行。
2.事务的作用
事务是数据库维护数据一致性的单位,在每个事务结束后,都能保持数据一致性。
3.事务的生命周期
- start transaction:开启事务
- rollback:撤销事务(事务回滚)
- commit:提交事务(更新事务)
4.并发事务出现的问题
生命周期介绍中,所有操作都是在一个Mysql会话中进行的,没有其他用户在同时连接数据库进行操作。单独一个用户读取数据库并不会出现问题,但是在实际过程中,同一时刻有很多用户在读写数据库,这时候并发事务就会出现问题。
4.1丢失更新
总结:A事务提交或撤销的时候,覆盖了B事务更显的数据。
时间点 | 事务A | 事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额1000元 | |
T4 | 查询账户余额1000元 | |
T5 | 存入100元,修改余额1100元 | |
T6 | 提交事务 | |
T7 | 取出100元,修改余额为900元 | |
T8 | 撤销事务(提交事务) | |
T9 | 余额恢复为1000元(900元) |
事务A和事务B并发更新同一数据,事务B提交成功,事务A撤销事务(提交事务),结果把事务B提交的数据覆盖了。这是绝对要避免出现的事情。
4.2脏读
事务A读到事务B未提交的数据
时间点 | 事务A | 事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | ||
T4 | 查询账户余额1000元 | |
T5 | 存入100元,修改余额1100元 | |
T6 | 查询账户余额1100元 | |
T7 | 撤销事务,余额恢复1000元 | |
T8 | 存入100,余额改为1200元 | |
T9 | 提交事务 |
事务A读到事务B未提交的数据,结果事务B撤销事务,导致事务A读的数据是脏数据。
注意:
数据表中的数据是实时改变的,事务只是控制数据的最终状态,也就是说如果没有正确的隔离级别,在更新操作语句结束后,即使事务未完成,其他事务就已经可以读取到改变的数据值了。
4.3不可重读读
事务A里面进行了两次查询,第二次查询到事务B更新的数据导致两次查询结果不一致。
时间点 | 事务A | 事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额1000元 | |
T4 | 查询账户余额1000元 | |
T5 | 存入100元,修改余额1100元 | |
T6 | 提交事务 | |
T7 | 查询账户余额1100元 |
4.4幻读
幻读与不可重复读类似,不可重复读,是读到事务B更新的数据;幻读是读取事务B插入的数据
时间点 | 事务A | 事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询用户A总的账户余额1000元 | |
T4 | 增加用户A一个新账户,并存入100元 | |
T5 | 提交事务 | |
T6 | 查询用户A总的账户余额1100元 |
4.5 总结
-
有两个事务,事务B提交失败会导致脏读。
-
事务B提交成功,事务A有更新操作会导致丢失更新。
-
事务B提交成功,事务A只有查询操作会导致幻读和不可重复读。
5.事务隔离级别
为了避免上面出现的四大并发事务问题,可以通过不同的事务隔离级别来解决。
5.1串行化
SERIALIZABLE
当事务A先开启了事务操作,事务B只能等事务A结束后,才能再进行操作。因此串行化可以避免所有的并发事务问题。但是这样会导致效率低。
5.2可重复读
REPEATABLE READ
Mysql默认
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
因此除了幻读不可避免,其他都可避免。
5.3读已提交数据
READ COMMITTED
一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到其他事务已经提交的对已有记录的更新。只能避免脏读。
5.4读未提交数据
READ UNCOMMITTED
一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新
5.5总结
串行化都可避免,但是效率较低,Mysql默认的隔离级别是可重复读。串行化效率太低,读未提交数据等于没设置,所以这两个都不会使用。
事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新
注:仅用于学习交流