MySQL事务操作原理与用法详解

事务: 有多个连续操作, 是一个整体: 要么所有的操作都成功, 要么所有的操作都失败.

事务实现: 有两种方式

  • 手动实现: 用户自定义事务区间, 自己对事务进行整体把握, 自己对事务进行最终处理(通过SQL指令实现)
  • 自动实现: 用户不管事务处理, 直接执行SQL指令(操作), 系统自动帮助用户进行处理

一、事务原理

SQL指令的操作(写), 并不是直接写入到数据表: 先将操作的结果缓存起来, 到系统日志文件中, 没有同步到数据表: 然后等待所有的操作都执行完执行, 等待一条执行的指令: 选择性的将所有的结果要么都同步到数据表, 要么都清空.

MySQL事务操作原理与用法详解

二、自动事务

当用户执行完一个SQL操作,系统会自动将结果同步到数据表中.

Mysql服务器认为用户的操作应该简化: 不应该每次做一个操作,还需要一个额外的操作去配合: 系统将这个额外的操作给自己做(commit操作).

自动提交: 系统在内部通过变量进行控制

show variables like 'autocommit';

MySQL事务操作原理与用法详解

关闭自动提交:

set autocommit = OFF;

MySQL事务操作原理与用法详解

自动提交关闭之后: 系统就不会将结果自动同步到数据表

MySQL事务操作原理与用法详解

Rollback: 回滚, 清空日志文件中的结果(没有同步)

MySQL事务操作原理与用法详解

自动提交被关闭之后: 需要手动提交
commit: 提交, 将日志文件中的结果同步数据表

MySQL事务操作原理与用法详解

系统自动提交都会保留: 如果真要处理事务(多个操作连贯),会使用手动事务(SQL指令控制)

三、手动事务

手动事务: 当需要进行事务操作的时候, 发送指令告诉服务器,之后的所有操作不要直接自动提交, 一直等到客户端发送执行指令的时候才进行事务的提交(同步).

1、开启事务告诉系统以后的操作不要同步到数据表

start transaction;

MySQL事务操作原理与用法详解

2、事务操作: 就是对SQL指令进行执行

MySQL事务操作原理与用法详解

3、事务提交

  • 提交数据: 同步到数据表: commit
  • 回滚数据: 清空日志内容:rollback

MySQL事务操作原理与用法详解

四、回滚点

事务在操作过程中,也许有很多步骤: 但是当某些步骤实现之后(都正确), 后续的操作可能容易出错, 可以选择在某些成功的操作之后设置一个回滚点: 以后操作失败了,可以回到该点继续下一步.

设置回滚点: savepoint 回滚点名字;

MySQL事务操作原理与用法详解

回滚到回滚点: rollback to 回滚点名字;

MySQL事务操作原理与用法详解

五、事务特性

事务一共有四大特性: ACID

  • A: 原子性(Atomic). 事务是一个整体, 不可拆分: 要么都成功,要么都失败.
  • C: 一致性(Consistency). 在事务操作的前后,对应的数据会一次性改变
  • I: 隔离性(Isolation). 事务的操作是独立的, 不受影响.
  • D:持久性(Durability). 事务的操作,一旦提交,数据就会永久性的写入到数据表, 不能回滚

事务一旦操作过程中,会涉及到锁机制: 一旦事务在操作的过程中,操作了某一行,那么在其他事务中,就不能对该行进行操作.

MySQL事务操作原理与用法详解

Innodb表的锁机制默认是行锁: 但是会因为查询条件没有索引而导致行锁升级为表锁.

MySQL事务操作原理与用法详解

六、事务条件

事务的应用

1、需要多个操作连贯完整(要么都成功,要么都失败)
2、事务的引用通常都是使用手动事务

事务的条件:要支持事务,必须使用innodb存储引擎