查看存储引擎是否支持事务:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
Transactions一栏是事务,只有innodb支持事务
事务
事务(transaction
):一组操作单元,通过操作CRUD等将数据从一个状态变为另一个状态
事务处理原则:一个事务中执行多个操作时,要么都被提交(commit
),要么放弃所有操作,全部回滚(rollback
)
事务主要用来处理操作量大,复杂度高的数据。比如,在职员管理系统中,删除一个员工,不仅要删除这个员工的基本资料,也要删除相关联的信息,比如账户、人事调动的信息、家庭信息等等,这样一组操作就构成了一个事务
- MySQL中只有innodb存储引擎支持事务
- 事务可以保证数据库合法性,一批SQL语句要么全部执行,要么全部不执行
- 事务用来管理insert、update、delete语句
事务的ACID特性
一致性和隔离性是重点
- 原子性(
atomicity
):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行中发生错误,会被回滚(rollback)到事务开始前的状态,就好像这个事务从来没有执行过一样. - 一致性(
consistency
):在事务开始和事务结束以后,数据库都是一个合法的状态,就是写入的数据完全符合数据库的规则(比如这个字符串字段只能写字符串,不能放个整数进去) - 隔离性(
isolation
):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 - 持久性:事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失
持久性的实现是通过事务日志实现的。日志包括重做日志和回滚日志。
我们对事务修改数据,数据库会先把变化信息写入日志中,然后进行修改,如果修改时出现了错误,数据库重启后会重新执行日志中的信息,恢复到之前的状态,来保证持久性
事务状态
事务就是对数据库的一个或多个操作,根据这个操作执行的不同阶段可以划分为几个状态
- 活动的(
active
):操作正在执行中 - 部分提交的(
partially committed
):操作执行完成,由于在内存中操作,还未刷新到磁盘里的状态 - 提交的(committed):在内存中对数据的修改全部刷新到了磁盘上,就是提交的状态
- 失败的(
failed
):当事务处于活动或部分提交时,如果遇到错误,会终止执行,这时就是失败状态 - 中止的(
aborted
):事务执行部分后变成失败的状态,那么就需要撤销之前执行操作,这个过程叫回滚,回滚结束后,数据库变回执行事务之前的状态,这时的事务就是中止的。
从上图可看出,事务最终状态要么是提交的,要么是中止的
如何开启/使用一个事务
事务完成的过程
1.开启事务
2.一系列DML操作
3…
4.事务结束状态:提交/终止
步骤一:开启事务
显式事务
start transaction 或者 begin 开始一个事务
mysql> begin;
mysql> start transaction;
START
TRANSACTION
后面可以跟修饰符
read only
:当前事务只能读取,不能修改read write
:当前事务既可以读取,也可以修改with consistent snapshot
: 一致性读取
start transaction read only; 开启一个只读事务
start transaction read only,with consistent snapshot; 开启只读事务和一致性读
start transaction read write,with consistent snapshot;开启读写事务和一致性读
- READ ONLY 和 READ WRITE 只能二选一
- 如果不指定,默认是读写模式(READ WRITE)
步骤二:写入SQL进行操作
步骤三:提交事务 或 终止事务
提交
mysql> COMMIT;
回滚事务
mysql>rollback;
回滚事务到某个保存点
mysql>rollback to savepoint
隐式事务
默认情况下,如果不使用start transaction或者begin语句开启一个事务,那每一条语句都算一个独立事务,这种特性叫事务的自动提交。
如果想要关闭自动提交,将autocommit的值设为OFF
即可
set autocommit=off;
或
set autocommit=0;
关闭自动提交后,我们写的多个SQL语句会默认属于同一个事务,直到手动输入COMMIT
提交或者显式写出ROLLBACK
回滚掉