MySQL事务——ACID四大特性

2024-05-22 09:01:34 浏览数 (1)

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

介绍

事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)。

MySQL事务由一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。

一个事务中每个sql语句是相互依赖的,如果某一条语句执行失败或产生错误,整个单元将回滚,所有所影响的数据回滚到事务开始前的状态。如果单元中的所有sql语句均执行成功,则事务被顺利执行。

MySQL的存储引擎

存储引擎的概念:在MySQL中的数据用各种不同的技术存储在文件或内存中。

代码语言:javascript复制
-- 查看mysql支持的存储引擎
show engines;

可以使用以上语句查看MySQL支持的存储引擎。 使用最多的存储引擎有:innoDB、myisam、memory等,其中innoDB是支持事务的,而myisam、memory等不支持事务。

事务的特点

ACID

  • A(Atomicity)原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • C(Consistency)一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
  • I(Isolation)隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
  • D(Durability)持久性:持久性是指一个事务一旦被提交,它对数据库的改变就是永久的,接下来的其他操作和数据库故障不应该对其有任何影响。

实例说明:

A和B各有1000元,现A给B转账500元,数据库将执行的语句为

代码语言:javascript复制
update 表 set A的余额 = 500 where name = 'A';
update 表 set B的余额 = 1500 where name = 'B';
  • 原子性:两条sql语句要么全部执行成功,要么都不执行。
  • 一致性:A、B各有1000元,总2000元,A给B转账后,A和B的余额总数仍为2000元
  • 隔离性:A给B转账时,同时B产生了消费,需等转账事务执行成功或失败后,消费事务才能执行,保证两事务互不干扰。
  • 持久性:A给B转账成功后,不能再对数据进行回滚到事务开始前,只能用新事物改变,即B又将500元转回给A

事务的实现

事务的实现主要由事务的特点决定

  • 原子性:由undo log日志实现,undo log是用于撤销回退的日志,主要存储数据库更新之前的数据,用于作备份。
  • 持久性:由redo log日志实现,redo log是用于灾难恢复的日志,将发生了修改而未提交的数据存入了redo log日志中,当发生断电等其他灾难异常时,可以根据redo log日志重新对数据做一个提交恢复。
  • 隔离性:由MVCC机制实现,MVCC主要依靠索引的隐藏列和 undo log日志实现。其中索引的隐藏列包括了该行数据的版本号、删除时间、指向 undo log 的指针等等,形成一条数据的版本链。当读取数据时,MySQL 可以通过隐藏列判断是否需要回滚并找到回滚需要的 undo log,从而实现 MVCC。
  • 一致性:一致性是事务追求的最终目标,由前面提到的原子性、持久性和隔离性实现。除此之外,一致性的实现也需要应用层面进行保障。

0 人点赞