美文网首页
mysql-InnoDB事务

mysql-InnoDB事务

作者: zoooooyyyy | 来源:发表于2020-08-21 23:12 被阅读0次

首先,了解一下常说的事务四大特性ACID

  • 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
  • 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。(其实原子性和隔离性间接的保证了一致性)
  • 隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

事务隔离级别

innodb事务隔离级别

读未提交:任何操作都不会加锁,可能读到别的会话中未提交的数据
读已提交:数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。只能读到已经提交的数据
可重复读:同一个事务中,对同一条记录的读取结果是不变的。默认级别
序列化:完全串行化的读,每次读都需要获得表级共享锁,读写互斥

脏读:事务A读取了事务B未提交的数据
不可重复读:事务A多次读取同一数据的间隙中,数据发生了修改并提交了,导致多次读取的结果不一致
幻读:某一次select操作得到的结果无法支持后续的业务操作。比如select时发现数据不存在,插入的时已存在。可用for update解决

ACID实现原理

https://www.cnblogs.com/GrimMjx/p/10575147.html

隔离性

隔离是通过锁来实现的。innodb中的锁可以分为两大类,行级锁和意向锁。
行级锁:
(1)共享锁(读锁 S Lock):允许事务读取一行数据
(2)排他锁(写锁 X Lock):允许事务修改或删除一行数据
只有S和S 兼容 其他都互斥
意向锁:
(1)意向共享锁(读锁 IS Lock):事务想要一次获取多行数据的共享锁,在给一个数据行加共享锁前需要先取得该的IS锁
(2)排他意向所(写锁 IX Lock):事务想要一次获取表中多行数据的排它锁,在给一个数据行加排他锁前需要先取得的IX锁

申请意向锁的动作是innodb完成的。事务A想要对表中的r行加X锁,innodb会先申请表的IX锁,再对记录r加X锁。此时,事务B想要进行全表操作,IX就可以直接告诉事务B需要等待,而不需要检查表的每一行查看是否有锁。

锁的算法

InnoDB有三种行锁的算法
(1)Record Lock:单行记录锁
(2)Gap Lock:间隙锁,锁定一个范围而非记录本身
(3)Next-Key Lock:结合(1)和(2),锁定一个范围加记录本身,为了解决RR(可重复读)下的幻读

Next-Key Lock
事务隔离级别为RR+sql走的非唯一索引、主键索引+for update = Next-Key Lock

原子性、一致性、持久性

原子性、一致性和持久性由数据库的redo log和undo log实现。
redo log:重做日志,用来保证事务的原子性和持久性,恢复提交事务修改的页操作。
undo log:用来保证事务的一致性,undo回滚行记录到某个特性版本及MVCC功能。两者内容不同。
redo记录物理日志,undo是逻辑日志。

redo

重做日志由重做日志缓冲和重做日志文件组成,innodb通过Force Log at Commit机制来实现持久性,当commit时,必须先将事务的所有日志写到重做日志文件进行持久化,待commit操作完成才算完成。
重做日志是innodb特有的

undo

事务回滚和MVCC 基于undo。undo是逻辑日志,只是将数据库逻辑的恢复到原来的样子,但是数据结构和页本身在回滚之后可能不同(插入大量的数据,rollback后,新增的空间不会回收)

相关文章

  • mysql-InnoDB事务

    首先,了解一下常说的事务四大特性ACID 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单...

  • MySQL-事务中的一致性读和锁定读的具体原理

    前言 上一篇文章MySQL-InnoDB行锁中,提到过一致性锁定读和一致性非锁定读,这篇文章会详细分析一下在事务中...

  • MySQL-InnoDB事务隔离级别和锁机制

    作者:刘仁鹏参考资料: 《MySQL技术内幕 InnoDB存储引擎》 MySQL的并发控制与加锁分析 1.基础知识...

  • InnoDB

    MySQL-InnoDB 架构 CheckPoint 已经被flush到页上的LSN。 刷盘策略 缩短数据库恢复时...

  • Mysql-InnoDB

    B+树B+树是InnoDB底层采用的数据结构,它是一种多叉平衡搜索树。InnoDB底层采用的存储结构就是B+树。它...

  • MySQL-InnoDB

    存储引擎是基于表的存在。InnoDB把表数据放在一个黑盒里,自己管理,它可以把每一个InnoDB存储引擎的表单独放...

  • mysql-innodb锁的实现及机制

    由于文章排版使用工具不能在简书上正常显示。 文章地址:mysql-innodb引擎锁的实现及机制

  • 重新学习Mysql数据库3:Mysql存储引擎与数据存储原理

    转自:https://draveness.me/mysql-innodb 作为一名开发人员,在日常的工作中会难以避...

  • MySQL-InnoDB表

    作者:刘仁鹏参考资料:《MySQL技术内幕 InnoDB存储引擎》 1.索引组织表 在InnoDB中,表都是根据主...

  • MySQL-Innodb统计

    mysql库中有innodb_index_stats、innodb_table_stats 对innodb的信息进...

网友评论

      本文标题:mysql-InnoDB事务

      本文链接:https://www.haomeiwen.com/subject/zoepjktx.html