推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
Mysql——》事务的属性
属性 | 描述 |
---|---|
原子性(Actomicity) | 一个事务中的操作,要么全部成功,要么全部失败 |
一致性(Consistent) | 在事务开始和完成时,数据都必须保持一致状态。 |
隔离性(Isolation) | 数据库提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。 |
持久性(Durable) | 事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。 |
一、原子性(Atomicity)
对数据库的一系列的操作,要么都是成功,要么都是失败,不可能出现部分成功或者部分失败的情况。
Q:如果前面一个操作已经成功了,后面的操作失败了,怎么让它全部失败呢?
A:回滚
Q:如何实现回滚?
A:在 InnoDB 里面是通过 undo log 来实现的,它记录了数据修改之前的值(逻辑日志),一旦发生异常,就可以用 undo log 来实现回滚操作。
二、一致性(consistent)
1、数据库自身的完整性约束
指的是数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。
比如主键必须是唯一的,字段长度符合要求。
示例:转账
A 账户余额减少 1000,B 账户余额只增加了 500,这个时候因为两个操作都成功了,按照我们对原子性的定义,它是满足原子性的, 但是它没有满足一致性,因为它导致了会计科目的不平衡。
2、用户自定义的完整性
用户自定义的完整性通常要在代码中控制。
示例:转账
A 账户余额为 0,如果这个时候转账成功了,A 账户的余额会变成-1000,虽然它满足了原子性的,但是我们知道,借记卡的余额是不能够小于 0 的,所以也违反了一致性。
三、隔离性(isolation)
在数据库里面会有很多的事务,同时去操作我们的同一张表或者同一行数据,必然会产生一些并发或者干扰的操作,而且这些并发操作,应该是透明的,互相不干扰的。通过这种方式,我们最终也是保证业务数据的一致性。
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
Q:如何实现持久性?
A:参考链接:Mysql——》事务的隔离级别
四、持久性(Durable)
我们对数据库的任意的操作,增删改,只要事务提交成功,那么结果就是永久性的,不可能因为我们重启了数据库的服务器,它又恢复到原来的状态了。
Q:如何实现持久性?数据库崩溃恢复(crash-safe)是通过什么实现的?
A:持久性是通过 redo log 来实现的。
我们操作数据的时候,会先写到内存的 buffer pool 里面,同时记录 redo log,如果在刷盘之前出现异常,在重启后就可以读取 redo log的内容,写入到磁盘,保证数据的持久性。
总结
原子性,隔离性,持久性,最后都是为了实现一致性。