Mysql事务特性acid

本文深入解析了数据库事务处理中的ACID特性,包括原子性、一致性、隔离性和持久性,并介绍了InnoDB如何通过undolog和redolog等机制实现这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概览

a:原子性Atomicity
c:一致性Consistency
i:隔离性Isolation
d:持久性Durability

原子性

事务

事务是最小的操作单元,原子性意味着,事务要么全成功要么全都不成功

Undo log

innodb提供的两种事务日志之一,undo log用于实现原子性

事务执行前会记录在undo log,事务执行后,如果出现异常则会根据undo log中记录的操作进行反向操作
例如:log中记录insert操作,则执行delete。)
即回滚操作,类似git的回滚

隔离性

同一时间只有一个操作能接触到数据

写-写操作的隔离

同时有两个事务对同一个数据进行写操作

innodb会使用锁来确保隔离性,即当有一个事务开始对某数据进行写时,会使改事务获取锁。其他事务改数据的修改会因为获取不到锁而阻塞,直到前面的事务提交或回滚释放锁后,才能获取锁

查看锁的概况
select * from information_schema.innodb.locks

写-读操作的隔离

解决办法为

加锁
数据为当前读时,需要加锁的读,保证读取数据为当前最新

mvcc:多版本并发控制(Multi-Version Concurrency Control)
数据为快照读时,使用readView(具体为一个类)的方式解决

事务的隔离级别和MVCC

持久性

mysql对数据库的改变是永久性的

常规的数据交互

对数据的修改操作(update)首先会将数据加载到buffer中,再由buffer刷新到磁盘,随机io

redo log

mysql采用redo log(预加载日志),在执行操作前,先将操作写到redo log buffer中,之后写入磁盘redo log文件
再根据redo log文件来进行写操作

相比于常规的优点:
1.保证操作第一时间记录下来,如果发生宕机,方便恢复
2.通过redo log文件进行写操作,属于文件内容追加式写操作,是顺序io,比直接从buffer到磁盘的随机io快速
3.buffer持久化数据是以数据页为单位修改,mysql的默认数据页为16k,一次更新代价较大,而redo log
只更改需要的部分

redo log buffer同步到磁盘的时间,由下面语句控制

innodb_flush_log_at_trx_commit
0:提交事务后,等待主线程每秒刷新
1:事务提交时,将缓冲区的redo log同步写入磁盘(推荐)
2:事务提交时,将缓冲区的redo log异步写入磁盘,不保证成功写入

一致性

上面三个特性加起来保证了一致性

事务执行之后数据库的完整性没有被破坏
事务执行前后数据都是合法的数据状态

数据库的完整性即指没有非法的数据形式出现

————————————————————————————

以上资料仅供学习记录用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值