SQL高级-事务
为什么有事务
事务广泛的运用于订单系统、银行系统等多种场景
举例:
如果用A账户转账给B账户500块,步骤分为三步
1、查询A账户余额是否大于等于500
2、A账户余额减少500
3、B账户余额增加500
如果执行第二步之后银行系统出现了故障,就会导致A账户余额减少500,而B账户余额没有增加,所以要想解决这个问题,要么三个步骤都执行,要么都不执行,事务的出现就是解决这个问题
什么是事务
事务是保持逻辑数据一致性与可恢复性的单位,它是一个操作序列,这些操作要么都执行,要么都不执行
事务的四大特性(ACID)
- 原子性(Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
- 一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
- 隔离性(Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
- 持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
事务的状态
事务分为以下几种状态:
- 活动的(active)
事务在开始之后到结束之前都处于活动状态 - 部分提交的(partially committed)
当最后一个操作执行完成时,只是在内存上起作用,还没有同步到磁盘上 - 失败的(faied)
当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态 - 中止的(aborted)
当事务转为失败的状态后,所有执行的操作将会回滚(撤销),数据库恢复到事务开始之前 - 提交的(commited)
当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态
事务的命令
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
事务的开启
代码示例
begin;
或者
start transaction;
如果使用start transaction;,我们可以在后面添加一些限制,如start transaction read only;只读性或start transaction read write;读写性
事务的提交
代码示例
commit;
事务的回滚
代码示例
rollback;
举例说明:

保存点
当我们开始事务之后,我们可能会敲很多语句,当我们想要改一下上条语句或上上条语句时,可以使用ROLLBACK语句重新开始,这感觉就是一夜回到解放前,当保存点概念出现后,我们只需要在一条语句执行后,设置保存点,就可以随意回滚到任意一点保存点了
- 设置保存点
代码示例SAVEPOINT 保存点名称; - 回滚到某个保存点
下边语句中的单词WORK和SAVEPOINT可有可无
代码示例ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称; - 删除保存点
代码示例RELEASE SAVEPOINT 保存点名称;
举例说明:

注意: 修改数据的命令会自动的触发事务,包括insert、update、delete