mysql innodb 事务作用_mysql-InnoDB事务

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

原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。

一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。(其实原子性和隔离性间接的保证了一致性)

隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

事务隔离级别

164a5a43d829

innodb事务隔离级别

读未提交:任何操作都不会加锁,可能读到别的会话中未提交的数据

读已提交:数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。只能读到已经提交的数据

可重复读:同一个事务中,对同一条记录的读取结果是不变的。默认级别

序列化:完全串行化的读,每次读都需要获得表级共享锁,读写互斥

脏读:事务A读取了事务B未提交的数据

不可重复读:事务A多次读取同一数据的间隙中,数据发生了修改并提交了,导致多次读取的结果不一致

幻读:某一次select操作得到的结果无法支持后续的业务操作。比如select时发现数据不存在,插入的时已存在。可用for update解决

ACID实现原理

隔离性

隔离是通过锁来实现的。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后,新增的空间不会回收)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值