mysql事务隔离级别

事务:保证数据库的一组操作要么全部成功,要么全部失败。mysql中事务是在存储引擎层实现的,Innodb是mysql支持事务的存储引擎

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

ACID

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性 (Isolation)
  • 持久性 (Durability)

事务隔离级别

事务隔离级别越高,效率越低。

  • 读未提交:一个事务还未提交,它所做的修改就能被看到
  • 读已提交:一个事务提交后,它所做的修改才能被看到
  • 可重复读:一个事务执行中看到的数据,和他在启动是看到的是一致的
  • 串行化:“读”加读锁,“写”加写锁,一个事务未完成之前,后面开启的事务都会发生锁冲突。

事务不同隔离级别的实现方式 —— 视图

记录在更新时会同时产生一条回滚日志,不同时间启动的事务,可以根据这些回滚日志产生不同的视图,这样就能保证读到不同的值。而不同的隔离级别,产生视图的时机不同:
  • 读未提交:没有产生视图,直接读取记录的值,这种情况成为脏读
  • 读已提交:视图是在每条SQL执行时产生的,所以就能已提交的事务。一个事务两次读同一个值可能不一样,称之为不可重复读。
  • 读未提交:视图是在事务启动时产生,因此在事务期间看到的值是相同的。
  • 串行化: 直接加锁,避免并行访问。

幻读:即使再可重复读的隔离级别下,一个事务按照相同的查询条件,仍然可能发现其他事务插入了满足其查询条件的数据。

事务开启方式

  • 显示启动:begin(start transaction),commit或者roll back
  • 隐式启动:set autocommit=1

问题1:为什么需要避免长事务

回滚日志会一直保留,知道没有比它更早的视图存在,所以长事务会导致回滚日志一直存在。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容