MySQL 数据库事务 ACID 特性

什么是数据库事务

将一些对数据库的操作组成一个集合,这个集合就是事务。事务的特点,包含在内的操作要么都执行,要么都失败。

关于事务经典的问题就是金融转账了,小明要向小红转账1000元,转账的过程中包含了以下操作。

1. 小明发起转账,账户金额 - 1000;

2. 小红接收转账,账户金额 + 1000;

整个转账的流程就是一个事务,这个事务包含了以上两个操作。此时,如果因为某些原因导致其中一个操作执行失败了,如果不保证事务的全失败或者全成功,那么就是出现小红账户 + 1000,而小明金额不变, 他两的总金额就改变了。这对于存储机构来说就造成了损失。

关系型数据库事务的 ACID 特性

1. 原子性:事务必须是原子性的,执行的操作要么都执行,要么都失败。

2. 一致性:事务对数据库执行的操作前后,必须保证操作的数据前后必须一致。比如金融转账,小明和小红的总金额是不会改变的。

3. 隔离性:并发访问数据库时,并发事务和事务之间是独立的,隔离的,互不影响。

4. 持久性:一个事务被提交之后,它对数据库的修改是持久性的,即使服务器发生重启也不会丢失修改。

值得注意的是,特性中的原子性,隔离性,持久性,最终服务的都是数据的一致性。换句话说,原子性、隔离性、持久性是方法,而一致性是目的。

ACID 特性都是如何保证的

日志

首先介绍几个常见的 MySQL 数据库日志。

1. 慢查询日志 (slow query log)。

当执行的 SQL 语句超过了一定的时间,默认是 10s,一般设置为 1s,慢查询日志就会把这条查询记录在日志内,管理员可以通过该日志找到慢 SQL ,然后通过 explain 命令对慢 SQL 进行分析,从而进行查询优化。

2. 二进制日志(binlog)

当执行修改表结构(create,alter,drop table),或者对数据修改(insert,update,delete)的命令时,即使没有修改成功,都会被记录在 binlog 中。

binlog 最主要的场景就是主从复制,比如进行数据库读写分离时,需要保证各个数据之间的数据一致性,就需要使用到 binlog。(具体原理这里不做详述。。其实是忘了,后面去熟悉一下再补上)

binlog 还可以帮助数据恢复。

binlog 是如何使用的。当我们执行上述对数据库进行修改的事务时,会先将操作写入到缓存中 binlog cache,只要在事务完成提交之后才会将缓存中的记录持久化到 binlog 文件中。因为写入到内存的速度更快,是为了效率考虑。

3.事务日志(redo log、undo log)

在特性的保证中进行介绍。

如何保证事务的原子性--undo log 回滚日志

事务日志 undo log 是保证原子性的关键。undo log 是逻辑日志,记录的是 SQL 语句。

当对数据库执行修改的操作时(insert,update,delete),会在undo log 中记录对应的记录。

比如执行 insert 时,会在undo log 中记录对应数据的主键 id 的 delete 语句,当进行事务回滚时,就会执行这条 delete 语句。同样的 update 就是记录修改前的数据,delete 就会记录对应数据的主键id,事务回滚时进行新增操作。

如何保证事务的持久性--redo log 重做日志

MySQL 5.X 版本之后默认使用的存储引擎是 InnoDB ,InnoDB 为了提高读写效率,在内存中引入了缓存池(Buffer Pool),我们对数据的修改查询其实都是对缓存池中的数据进行操作。比如获取数据会先到缓存池中获取,修改数据会先写入到缓存池中,缓存池中的数据会定期写入到磁盘中。

此时,如果缓存池中的数据没有持久化到磁盘中时,数据库发生了宕机,这就会导致数据丢失。

redo log 就是为了解决这个问题。

当执行事务时,会将修改数据的记录写入到 redo log 中,在事务提交后,机会根据刷盘策略将数据刷新到磁盘中。比如事务提交时,关闭MySQL 时。而事务提交时又有三种策略:1. 提交时刷盘,性能差,但是安全。对应设置的数字为 0 ;2.提交时不刷盘,性能好,但是安全性差。设置的数字为1;3. 每次提交都只把 log buffer 中的redo log写入到文件系统缓存。

保持学习,文章如果有错误烦请指出。

  • 35
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值