事务隔离级别

事务及其ACID属性

  • 原子性(Atomicity) :当前事务的操作要么同时成功,要么同时失败。原子性由undo log日志来实现。

  • 一致性(Consistent) :使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。

  • 隔离性(Isolation) :在事务并发执行时,他们内部的操作不能互相干扰。隔离性由MySQL的各种锁以及MVCC机制来实现。

  • 持久性(Durable) :一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来实现。

读未提交

新建查询窗口A事务和B事务并设置隔离级别为读未提交:set tx_isolation='read-uncommitted';

在窗口A事务下查询一条数据但是不提交事务如下

在新建窗口B事务下修改一条数据但是也不提交事务如下

再通过A事务查询本条数据会发现本条数据是B事务修改但是没有提交事务的数据这就是脏读。

这种情况会导致假如B事务修改完数据还没提交事务,但是A事务读取到B事务未提交的数据去做处理就会导致A事务处理的结果是不对的。

读已提交

新建查询窗口A事务和B事务并设置隔离级别为读已提交:set tx_isolation='read-committed';

A事务修改读已提交并查询数据但是没有提交事务的情况

B事务修改本条记录并不提交事务

通过A事务窗口去查询本条记录发现查询不到B事务修改后的数据,这就是读已提交解决了脏读问题,但是B事务提交事务后A事务还没有提交事务可是A事务再次查询的时候会读取到B事务修改后的数据这就会产生新的问题不可重复读。

可重复读

新建查询窗口A事务和B事务并设置隔离级别为可重复读:set tx_isolation='repeatable-read';

A事务查询但不提交事务所查询到的数据:

B事务修改本条数据提交事务并查询数据:

现在这条数据字段balance的数据应该是500,但是在A事务中这条数据的时候还是450这样就解决了不可重复读问题。但是在B事务下新增一条数据后通过A事务再去查询B事务是查询不到的但是A事务可以修改B事务新增的这条数据所以就会产生幻读的问题,然后再去查询又可以查询到这条数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值