极客时间--MySQL实战45讲(3)事务隔离

极客时间的第三讲,关于MySQL的事务隔离;
关于事务的ACID(原子性、一致性、隔离性、持久性),相关文章多如牛毛,不多言语。这一讲主要说的是隔离性。
在数据库上有多个事务同时执行的时候,可能会出现脏读、不可重复读、幻读等问题,因此需要有不同的隔离级别;SQL标准(非MySQL独有)的隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。相关的概念如下:

0.读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
1.读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
2.可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
3.串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

数据库会创建一个视图,事务访问的时候,以视图的逻辑结果为准。不同的隔离级别,数据库行为有所不同。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个SQL语句开始执行的时候创建的。“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

文章以"可重复读"为例,来说明事务隔离是如何实现的。在MySQL中,每条记录的更新的时候,都会同时记录一条回滚操作,写在回滚日志中,当需要回滚时,执行回滚即可得到前一步的值,一直到事务开始前;
如图所示,某个事务将表中的字段按顺序从1 update成2、3、4,那么回滚日志就会类似这样。在不同阶段会有不同的read-view,当其他事务访问该记录时,可能会有不同的值,即一条记录可以存在多个版本,这是数据库的多版本并发控制。当然,如果隔离级别高,进行了加锁,比如串行化这个级别,那么,读取的值应该是强一致的。
在这里插入图片描述
另外,由于回滚日志占据物理空间,该日志只有在不被需要的时候才会被删除。在使用事务时,应该尽量避免长事务,否则会导致回滚日志十分大。

链接:https://pan.baidu.com/s/1CIciItPoKQxHaJVsbBfWZQ
提取码:ld91

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值