搞懂数据库-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默认的隔离级别是可重复读。串行化效率太低,读未提交数据等于没设置,所以这两个都不会使用。

事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新

注:仅用于学习交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值