mysql数据库事务四大特性的实现原理

事务的四大特性

原子性、一致性、隔离性、持久性

原子性实现

原子性保证事务要么全执行成功,要么全不执行

mysql使用回滚机制实现,undo log实现回滚。
事务执行 insert、update、delete 操作,会生成对应的 undo log。undo log是和原操作相反的操作。例如添加一条记录,undo log 存储删除该记录。
原始数据:
原始数据
执行sql对应的undo log

insert into t1 values(2, 40)
//undo log: delete from t1 where id = 2
update t1 set age = 30 where id = 1
//undo log: update t1 set age = 20 where id = 1

持久性实现

持久性提交的记录保存到磁盘,宕机不会丢失。

MySQL数据存储在磁盘上,频繁读取I/O效率低,所以一般会在加一层内存缓冲区,通过缓冲区读取数据过程:

  • 读数据:先尝试从缓冲区读取数据,缓冲区数据不存在,从磁盘读数据,并将读到的数据更新到缓冲区。
  • 写数据:先将数据写入到缓冲区,缓冲区的数据定时刷新到磁盘中。

使用缓冲区导致数据不是实时写入磁盘,为防止缓冲区数据丢失,mysql使用redo log保证持久性。redo log日志记录了所有更新操作,每更新一条记录,都会生成一个redo log日志,并将redo log日志写入磁盘。
虽然redo log也需要写盘,有IO消耗,但是redo log按照顺序写如磁盘,顺序IO效率更高。redo log 只记录更新的日志,需要刷盘的数据更小。
数据记录刷新以页为单位,每个页默认大小为16kb,即使页中跟新非常少的数据,也需要将这个页写回磁盘。

隔离性实现

隔离性多个事务并行执行,互不影响。

隔离级别:未提交读、提交读、可重复读、串行化。
mysql使用锁+多版本并发控制(MVCC)实现事务隔离。。insert delete 会加行锁,update使用索引时会加行锁,否则会加表锁;没有更新的记录会加next-key锁。select时,使用MVCC实现并发隔离读。MVCC只用在提交读、可重复读。
MVCC原理:https://blog.csdn.net/huhu123444/article/details/122036671
MVCC基本思路:保存记录的多个快照实现。每条记录会保存隐藏列,标志创建版本号、删除版本号等,事务会取版本号作为事务号。读操作对比版本号,避免加锁。

一致性实现

一致性保证修改记录满足约束条件,符合逻辑关系。例如:A向B还款100,A账户-100,B账户+100,同时A欠B的金额-100。
一致性通过原子性、持久性、隔离性保证。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值