MySQL事务
MySQL 事务的ACID原则
ACID主要涵盖四条原则,即: - A/Atomicity:原子性 - C/Consistency:一致性 - I/Isolation:独立性/隔离性 - D/Durability:持久性 数据库的事务一般也要求满足ACID原则,ACID是关系型数据库实现事务机制时必须要遵守的原则。 ### 原子性 MySQL中原子性指组成一个事务的一组SQL要么全部执行成功,要么全部执行失败,事务中的一组SQL会被看成一个不可分割的整体,当成一个操作看待。 好比事务A由①、②、③条SQL组成,那这一个事务中的三条SQL必须全部执行成功,只要其中任意一条执行失败,例如②执行时出现异常了,此时就会导致事务A中的所有操作全部失败。 ### 一致性 不管事务发生的前后,MySQL中原本的数据变化都是一致的,也就是DB中的数据只允许从一个一致性状态变化为另一个一致性状态。这句话似乎听起来有些绕,不太好理解对嘛?简单解释一下就是:一个事务中的所有操作,要么一起改变数据库中的数据,要么都不改变,对于其他事务而言,数据的变化是一致的,上栗子: 假设此时有一个事务A,这个事务隶属于一个下单操作,由「⓵扣库存数量、⓶增加订单详情记录、⓷插入物流信息」三这条SQL操作组成。 一致性的含义是指:在这个事务执行前,数据库中的数据是处于一致性状态的,而SQL执行完成之后事务提交,数据库中的数据依旧处于一个“一致性”状态,也就是库存数量+订单数量永远是等于最初的库存总数的,比如原本的总库存是10000个,此时库存剩余8888个,那也就代表着必须要有1112条订单数据才行。 这也就是前面说的:“事务发生的前后,MySQL中原本的数据变化都是一致的”,这句话的含义,不可能库存减了,但订单没有增加,这样就会导致数据库整体数据出现不一致。 如果出现库存减了,但订单没有增加的情况,就代表着事务执行过程中出现了异常,此时MySQL就会利用事务回滚机制,将之前减的库存再加回去,确保数据的一致性。 但来思考一个问题,如果事务执行过程中,刚减完库存后,MySQL所在的服务器断电了咋整?似乎无法利用事务回滚机制去确保数据一致性了撒?对于这点大可不必担心,因为MySQL宕机重启后,会通过分析日志的方式恢复数据,确保一致性。 ### 独立性/隔离性 隔离性/独立性,意思就是指多个事务之间都是独立的,相当于每个事务都被装在一个箱子中,每个箱子之间都是隔开的,相互之间并不影响。举个例子: 假设数据库的库存表中,库存数量剩余8888个,此时有A、B两个并发事务,这两个事务都是相同的下单操作,由「⓵扣库存数量、增⓶加订单详情记录、⓷插入物流信息」三这条SQL操作组成。 此时A、B两个事务一起执行,同一时刻执行减库存的SQL,因此这里是并发执行的,那两个事务之间是否会互相影响,导致扣的是同一个库存呢?答案是不会,ACID原则中的隔离性保障了并发事务的顺序执行,一个未完成事务不会影响另外一个未完成事务。 隔离性在底层是如何实现的呢?基于MySQL的锁机制和MVCC机制做到的。 ### 持久性 持久性是指一个事务一旦被提交,它会保持永久性,所更改的数据都会被写入到磁盘做持久化处理,就算MySQL宕机也不会影响数据改变,因为宕机后也可以通过日志恢复数据。
顶部
收展
底部
[TOC]
目录
MySQL 事务的ACID原则
MySQL 事务的隔离机制
MySQL事务实现原理
MySQL之MVCC机制
相关推荐
MySQL教程
MySQL命令
MySQL索引
MySQL锁机制
MySQL版本特性