事务原理
2025-6-15
| 2025-6-18
Words 918Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password
😀
黑马mysql事务
 

📝 mysql事务

开启事务的两种操作

1.mysql默认是开启自动提交的,也就是每执行一条sql就提交更新数据了,那可以关闭自动提交事务,set @@autcommit = 0;关闭事务,当多个sql执行之后,成功执行commit手动提交事务,失败执行rockback回滚事务。
2.在开始执行sql时,先执行start transaction开启事务,sql执行完之后,成功执行commit手动提交事务,失败执行rockback回滚事务。

事务的四大特性

原子性:在事务中的几个sql执行时,要么全部成功,要么全部失败
一致性:事务执行成功时,必须成一个一致性状态转换成另一个一致性状态,比如转钱,一个账户增加100,另一个账户就要减少100,达到一个新的守恒状态。
隔离性:多个事务同时执行时,各个事务应该是互不影响的。隔离性的强弱跟事务的隔离级别相关的。
持久性:一旦提交事务,那数据应该是永久保存在磁盘中的。

事务四大特性的原理

原子性,一致性,持久性是由redo log和undo log实现的,隔离性是由锁机制和mvcc实现的。
notion image

redo log实现持久性

是什么?

redo log重做日志,记录的是事务提交数据页的物理修改,是用来实现事务的持久性。

为什么需要redo log?

当执行sql语句时,会把磁盘中的数据读取到内存中,在内存中执行sql语句,执行完之后再把数据更新回磁盘中。
但当从内存更新到磁盘中出错了,那就不能保证持久性了
notion image

有了redo log

redo log记录的是事务对数据操作的日志,把日志记录到磁盘中,当内存数据更新到磁盘出错时,使用redo log可以恢复数据。
notion image

undo log

是什么?
undo log 记录的是事务提交之前数据是什么,是用来保证原子性的。
如何实现?
undo log记录的是sql执行相反的记录,比如当执行一条delete语句,undo log中就会新增一条对应的insert语句,当执行一条update语句,它记录的就是一条相反的update语句,当执行事务回滚时,就可以从日志中读取相应的内容,并进行回滚。
undo log在事务执行时产生,事务提交时,并不会立刻删除undo log,因为这些日志还可能用于mvcc。

MVCC多版本并发控制

当前读

每个事务读取的是最新的数据。
分别开启两个事务,其中一个事务更改了数据,并且提交事务。另一个事务可以读取到最新的数据。这也叫做幻读。

快照读

读取数据时会生成快照数据,保证在一个事务内实现可重复读,mysql就是这样的机制。
在mysql中,当事务执行第一个select时生成快照数据,之后再同一个事务中再次读取数据时,读取的就是第一次执行select生成的快照数据,保证了可重复读的隔离级别。
 
mysql索引MCP学习
Loading...