MySQL事务管理
MySQL事务管理
事务的概念
事务由一条或多条SQL语句组成,这些语句在逻辑上存在相关性,共同完成一个任务,事务主要用于处理操作量大,复杂度高的数据。比如转账就涉及多条SQL语句,包括查询余额(select)、在当前账户上减去指定金额(update)、在指定账户上加上对应金额(update)等,将这多条SQL语句打包便构成了一个事务。
MySQL同一时刻可能存在大量事务,如果不对这些事务加以控制,在执行时就可能会出现问题。比如单个事务内部的某些SQL语句执行失败,或是多个事务同时访问同一份数据导致数据不一致的问题。
因此一个完整的事务并不是简单的SQL集合,事务还需要满足如下四个属性:
- 原子性: 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,则会自动回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
- 隔离性: 数据库允许多个事务同时访问同一份数据,隔离性可以保证多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致。
- 一致性: 在事务开始之前和事务结束以后,数据库的完整型没有被破坏,这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联型以及后续数据库可以自发性地完成预定的工作。
- 持久性: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
简称ACID:
- 原子性(Atomicity,又称不可分割性)。
- 隔离性(Isolation,又称独立性)。
- 一致性(Consistency)。
- 持久性(Durability)。
事务的版本支持
事务的版本支持
通过show engines
命令可以查看数据库引擎。
说明一下:
- Engine: 表示存储引擎的名称。
- Support: 表示服务器对存储引擎的支持级别,YES表示支持,NO表示不支持,DEFAULT表示数据库默认使用的存储引擎,DISABLED表示支持引擎但已将其禁用。
- Comment: 表示存储引擎的简要说明。
- Transactions: 表示存储引擎是否支持事务,可以看到InnoDB存储引擎支持事务,而MyISAM存储引擎不支持事务。
- XA: 表示存储引擎是否支持XA事务。
- Savepoints: 表示存储引擎是否支持保存点。
事务的提交方式
autocommit的值为ON表示自动提交被打开,值为OFF表示自动提交被关闭,即事务的提交方式为手动提交。set autocommit = 1;
通过set命令设置autocommit全局变量的值,可以打开或关闭事务的自动提交。
使用begin或start transaction命令启动一个事务,右终端查看银行用户表中的信息。
使用begin或start transaction命令启动的事务,都必须要使用commit命令手动提交,数据才会被持久化,与是否设置autocommit无关。
- 使用begin或start transaction命令,可以启动一个事务。
- 使用savepoint 保存点命令,可以在事务中创建指定名称的保存点。
- 使用rollback to 保存点命令,可以让事务回滚到指定保存点。
- 使用rollback命令,可以直接让事务回滚到最开始。
- 使用commit命令,可以提交事务,提交事务后就不能回滚了。
- 脏读:指一个事务读取了另一个未提交事务修改的数据。例如,事务 A 修改了某条数据但未提交,此时事务 B 读取了该未提交的数据,如果事务 A 随后回滚,那么事务 B 读取到的数据就是无效的脏数据。
- 不可重复读:指在一个事务内,多次读取同一数据时,得到的结果不一致。比如,事务 A 在第一次读取某条数据后,事务 B 对该数据进行了修改并提交,当事务 A 再次读取该数据时,得到的结果与第一次不同。
前者不考虑数据的提交状态直接读取最新数据,后者通过串行执行保证每次读取都是当前最新数据。而读提交和可重复读隔离级别则根据数据的状态和事务的操作类型,灵活地选择当前读或快照读,以在保证一定的数据一致性的同时,提高并发性能。