mysql的事务

前言

之前的文章我们讲述了mysql 的大致结构和日志,今天我们就来讲下老生常谈的事务。说起事务大家是不是肯定想起的就是acid(原子性,一致性,隔离性,持久性),今天我们就来说说这个隔离性。

mysql事务的隔离级别

mysql事务隔离级别大概有四个
1.读未提交:可以读到其他事务未提交的数据,又称为脏读。
2.读提交:读到其他事务提交的数据。
3.可重复读:在事务期间看到的数据是一致的。
4.串行化:对同一行记录,读会加读锁,写会加写锁。一个事务想要操作这个数据,必须等到另一个用户操作完之后,才能操作。(这个加锁感觉应该是包含的间隙锁,因为串行化是为了避免第事务期间读出来的数据条数不一样,所以应该是加了间隙锁的。)

在实现上呢,读未提交没做任何处理。读提交和可重复读都是用了视图来保证的,读提交是每个sql执行的时候创建的视图,所以事务执行期间,可以看到其他事务提交的数据。可重复读是在事务开启的时候就创建了视图,所以在事务执行期间是看不到其他事务的提交数据。而串行化是通过锁来实现的。
oracl的默认事务级别是读提交

事务的隔离实现

上面我们说了mysql 的事务隔离级别,和各个级别的实现方式。接下来,我们将更加深入的讲解下事务的隔离实现,我们这里就用可重复读来作为讲解例子。
在mysql中对每一条的更新语句,都有一个回滚语句相对应。假设一个值被从1顺序的改到了1,2,3,4那么回滚日志中便会有下面这一段回滚日志。
在这里插入图片描述
从上面我们可以看出,不同事务之所以能看不到同一条记录的不同值完全靠的就是回滚日志。比如事务a对吧,它先改的值,后面事务b和事务c也对同一条记录修改了,那怎么让事务a看到的值不变呢,直接经过两次回滚操作即可。
那么大家理解了这个之后,是不是也理解为什么长事务会消耗大量的内存和cpu呢,就是因为长事务需要不断的产生回滚日志和进行回滚操作。那么回滚日志什么时候删除呢,就是没有比这个回滚事务更早的事务了,大致意思就是。如上面这个图,事务a是最早的事务,如果事务a结束,这个回滚日志a段就可以删除了,如果事务a没有结束,即使事务b结束了,这个事务b的日志也不会被删除,因为事务b不是最早的事务。

事务的启动方式

1.显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。2.set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。
不推荐第二种,推荐大家set autocommit=1,将这个自动提交开启。然后为了避免每一次begin产生的开销,大家可以使用commit work and chain。这个在事务提交之后,会直接开启下一个事务,没有begin的开销。

总结

今天给大家介绍了mysql 的事务隔离级别,和事务的大致实现,到事务的底层实现原理。最后到事务的启动方式。希望大家可以对mysql 的事务有一个系统的认识。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark---小鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值