Mysql学习笔记------事务

相信只要是程序员,都知道事务.今天也算是复习吧,将事务在梳理一遍.

首先就是四大特性:
原子性(Atomicity): 不可再分的特性,要么都成功,要么都失败,
一致性(Consistent): 保证事务前后数据的完整性
隔离性(Isolation): 当多个事务并发操作时,每个事务之间相互独立,互不干扰
持久性(Durable): 操作成功后,数据可以永久保存.

事务并发带来的问题:

脏读: 读取到了其他事务未提交的数据
不可重复读: 读取到了其他事务已提交的数据(针对删除和更新操作)
幻读: 也是读取到了其他事务已提交的数据(只针对插入操作)

为了解决这三个问题,因此有了四大隔离级别:
read uncommitted 读未提交: 未解决任何问题
read committed 读已提交: 解决脏读问题
Repeatable Read 可重复读: InnoDB默认隔离级别,解决了不可重复读问题
Serializable 序列化: 都解决,但效率极低,一般不用.

虽然Mysql中默认隔离级别是Repeatable Read,但在InnoDB中是解决了幻读问题.
其实解决幻读大致有两个思路 :
1.加锁,在读取事务前对其加锁,禁止其他事务对该数据进行操作(LBCC) 锁有很多种 以后学了再详说
2.快照, 生成一个数据请求时间点的一致性数据快照,并用这个快照来提供一定级别的一致性读取(MVCC)

在Mysql中快照是如何实现的呢?

其实Mysql每一条数据都会添加三个默认字段.
DB_ROW_ID : 行标识
DB_TRX_ID: 插入或更新行的最后一个事务ID
DB_ROLL_PTR: 回滚指针(删除版本号)

当一条数据被创建时,该数据会有一个DB_TRX_ID,可以理解为创建ID,也是当前事务ID,此时是没有DB_ROLL_PTR的,而当该数据被修改以后,会出现修改前和修改后两条数据.
修改前的数据会有DB_ROLL_PTR,为当前事务ID,
修改后的数据DB_TRX_ID会变为当前事务ID,DB_ROLL_PTR为NULL .

在这里插入图片描述

当我们进行查询时,InnoDB只查询DB_TRX_ID小于等于当前事务版本的数据行.因此当我在查询的时候,我也会有一个事务id,而其他事务进行插入操作时,插入的新数据的DB_TRX_ID是要大于我的事务ID的,所以我也不会读取到该新数据.

over

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值