MySQL事务

MySQL学习总结系列

1.MySQL概览

2.MySQL索引

3.MySQL锁

4.MySQL事务

        事务由独立单元的一个或者多个sql语句组成,在这个单元中sql语句是相互依赖的,整个单元是不可分割的整体,要么全部执行成功,要么都失败回滚到事务初始状态。事务的特性ACID,原子性、隔离性、持久性和一致性。其中原子性依赖undolog、redolog实现;隔离性依赖锁实现;持久性依赖redolog、DoubleWrite实现;一致性依赖MVCC(innodb引擎)、锁;

        事务的隔离级别包括读未提交,读已提交,可重复读和串行化。

读未提交:读未提及存在脏读问题。脏读即当前事务读取了其他事务中未提交的数据。脏读对应的还有脏写,即当前事务中的数据被其他事务修改,这个属于基本的要求,每个事务隔离级别都不存在脏写问题。

读已提交:读已提交解决了脏读问题,但存在不可重复读问题,即在当前事务中读取到其他事务已提交的成果,导致两次读取的数据不一致。

可重复读:解决了不可重复读的问题,但存在幻读。幻读跟不可重复读类似,这里主要指的是数据新增,假设事务a在对一批数据进行修改,当事务提交后再查询发现有数据并没有修改(其他事务新增的记录)。

串行化:最高的事务隔离级别,能够解决上述所有问题,但对数据库性能影响较大,使用频率较低。

        MVCC(多版本并发控制):为了提高数据库的并发性能,更好的解决读写冲突(不加锁、非阻塞的方式并发读),innodb引擎采用mvcc。

        当前读和快照读:当前读是以加锁的方式读取数据,读取的是最新版本的数据(select ...for update );快照读是常规的select操作,未加锁操作。

        MVCC多版本并发控制的实现是通过数据行中的两个隐藏列(txid和rollbackpoint)结合readview实现的,两个隐藏列一个保存修改数据的事务编号,另一个指向回滚段中的原始记录。readview根据隔离级别在事务的不同阶段创建,它记录了当前事务运行过程中识别到的受其他事务的影响情况。

        MVCC仅在读已提交和可重复读这两个事务隔离级别下有效,读未提交读取的是最新数据,串行化会对所有记录加锁,与MVCC并不兼容。其中RC和RR模式下不同的点在readview的创建时间,RR模式下是事务一开始就创建readview,后续的所有操作都依赖同一个readview进行判断;RC模式下是在每次select动作之前创建readview,所以mvcc只有在RR模式下能解决幻读问题,

readview关键信息

create txid:当前事务的id

mintxid:readview创建时活动的最小事务id

maxtxid:readview创建时活动的最大事务id

mids:readview创建时活跃的id集合

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值