使用语言 MySQL
使用工具 Navicat Premium 16
代码能力快速提升小方法,看完代码自己敲一遍,十分有用
- 拖动表名到查询文件中就可以直接把名字拉进来
- 中括号,就代表可写可不写
目录
1.事务
1.1 需要事务的原因
在之前默认所有的数据库操作都会被正确执行,这是一种非常理想的情况。对应不是很重要的数据,如日志数据,即使某条日志数据写入数据库失败,对应整个应用来说也不会产生非常严重的影响。但是在某些场景下,数据操作失败会产生非常严重的后果。
- 例如:与金融相关的应用在任何情况下都不允许出现问题,因为这些数据不是一个数字,而是等值的钱,系统中的钱凭空变多或变少都会造成非常重大的影响。
那么该如何解决这个问题呢?MySQL通过事务机制保证数据的完整性。
1.2 事务介绍
1.2.1 事务基础介绍
事务(Transaction)指将一系列数据操作捆绑成一个整体并统一管理的机制。可以把事务理解成一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。因此,事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是作为最小的控制单元被使用的,它特别适用于多用户同时操作的数据库系统。
在使用事务时,要注意事务时作为单个逻辑工作单元执行的一系列操作。这个逻辑工作单元必须有4个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)及持久性(Durability),这些特性通常简称ACID。
1.2.2 ACID特性详细剖析
原子性(Atomicity)
- 事务是一个完整的操作。事务的各元素是不可分的,这种特性也被称为原子性。事务中的所有元素必须作为一个整体提交或回滚(Rollback)。若事务中的任何元素失败,则整个事务失败。
- 以支付平台转账事务为例,若该事务已提交,则这两个账号的数据会更新;若由于某种因素,事务在成功更新这两个账户之前终止,则不会更新这两个账户的余额,并且会撤销对任何账户余额的修改,也就是说,事务不能被部分提交。
- 回滚泛指数据库更新失败,返回上一次正确状态的行为(撤销)。数据库中的回滚指在数据库中的数据发生错误时为保证数据库的完整性将数据还原到发生错误以前状态的操作。
一致性(Consistency)
- 当事务完成时,数据必须处于一致状态。也就是,在事务开始之前,数据库中存储的数据处于一致状态。在正在进行的事务中,数据可能处于不一致的状态,如数据可能部分被修改。然而,当事务成功完成时,数据必须再次恢复已知的一致状态。通过事务对数据所做的修改不能损坏数据,或者是事务不能使数据存储处于不稳定状态。
- 以支付平台转账事务为例,在事务开启之前,所有账户余额的总额总处于一致状态。在事务进行的过程中,一个账号的余额减少了,而另一个账号余额尚未修改。因此,所有账户余额的总额处于不一致状态。事务完成以后,账号余额的总额再次恢复已知的一致状态。
- 就是代表两个的执行状态都是一致的,要么都是执行成功,要么都是执行失败
隔离性(Isolation)
- 对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖或影响其他事务。
- 就是各事务之间不要连在一起,例如A给B转账的事务不要与A给C转账的事务连在一起
持久性(Durability)
- 事务的持久性指不管系统是否发生故障,事务处理的结果都是永久的,SQL语句默认也是永久的(可以修改)。
- 一个事务成功完成之后对于数据库的改变是永久性的,即使系统出现故障也是如此。也就是说,一旦事务被提交,事务的效果会被永久的保留在数据库中。
1.3 在MySQL中使用事务
1.3.1 UNDO日志和REDO日志
在MySQL中使用事务,首先要保证数据表所使用的存储引擎支持数据库。常用的存储引擎InnoDB支持事务操作,而MyISAM不支持事务操作。InnoDB存储引擎主要通过UNDO日志和REDO日志实现对事务的支持。MySQL的另一种存储引擎BDB也支持事务。
任何一种数据库都拥有各种各样的日志,用来记录数据库的运行情况、日常操作、错误信息等,MySQL数据库也不例外。例如,当用户root登录到MySQL服务器时,就会在日志文件里记录该用户的登录时间、执行操作等。为了维护MySQL服务器,经常需要在MySQL中进行日志操作。
UNDO日志
- 复制事务执行前的数据,用于在事务发生异常时回滚数据
REDO日志
- 记录在事务执行中每条对数据进行更新的操作。当事务被提交时,该内容被刷新到磁盘中。