概述
MySQL中的事务是一组顺序的语句、查询或操作,如select、insert、update或者delete操作,作为一个独立的工作单元可以被提交或回滚。如果事务对数据库进行多次修改,会发生两件事情:
- 当事务被提交的时候,所有的修改都被成功的提交。
- 当事务被回滚的时候,所有的修改都被放弃。
换句话说,一个事务没有成功的完成集合中的所有操作,事务就没有成功。意思是如果一些语句失败,事务操作就不会产生结果。
在MySQL中,一个事务开始于第一条可能执行的SQL语句,当它查找到一个显示的或者隐含的提交或回滚操作时结束。显示的使用commit或rollback语句,当一个DDL(Data Definition Language——数据定义语言)语句被执行的时候会带有一个隐含式的事务。
我们可以通过银行中的一个小的业务场景来理解事务。注意,这个业务场景只是一个很简单的示例,银行的业务要比下面的复杂很多倍。假设一个银行储户想要把钱从一个账户转账到另外一个账户中。 我们下面将其分解为一些数据语句表示整个流程。
- 第一,必须检查第一个账户中的转账金额是否满足。
- 其次,如果账户中的金额满足转账需求,从第一个账户中减去金额并且更新该账户。
- 最后,在第二个账户中存入金额,然后更新第二个账户并结束事务。
- 上面的三个步骤就是一个完整的事务,其中任何一个步骤出现错误,本次事务都将被回滚。
事务的特性
事务包含四大主要特性,这些特性被称为ACID:
- Atomicity 原子性
- Consistency 一致性
- Isolation 隔离性
- Durability 持久性
1、原子性
这个特性确保事务单元中的语句或操作必须全部执行成功。因此,如果任何操作失败,整个事务异常,并且所有操作将回滚到之前的状态。
- 提交语句
- 回滚语句
- 自动提交设置
- 自来INFORMATION_SCHEMA表的操作数据
2、一致性
这个特性确保数据只有当事务提交成功能时才能更改状态。
- InnoDB双写缓冲区
- InnoDB故障修复
3、隔离性
保证事务单元中的每一个操作的独立性。它也确保语句之间是透明的。
- 设置隔离级别
- 自动提交设置
- InnoDB锁的低层细节
4、持久性
保证事务的提交结果永久有效,甚至系统崩溃的情况下亦是如此。
- 存储设备上的写缓存
- 存储设备上的电池供电缓存
- 配置选项:innodb_file_per_table
- 配置选项:innodb_flush_log_at_trx_commit
- 配置选项:sync_binlog
注:在所有MySQL引擎中,只有InnoDB完整实现的事务的ACID特性。
MySQL的事务语句
MySQL控制事务语句如下:
- start transaction/begin:开始事务。
- commit:提交事务
- rollback:回滚事务
- 自动提交
自动提交
MySQL中执行的每一条DML(insert、update、delete等)语句,系统都使用了自动事务的概念,即在语句的开始自动启动事务,在语句执行完成并且自动提交后关闭事务。如果我们不想让MySQL来自动提交,可以使用下列语句进行关闭。
关闭自动提交
set autocommit = OFF;
或
set autocommit = 0;
打开自动提交
set autocommit = ON;
或
set autocommit = 1;
注意:如果使用start transaction命令显示的启动一个事务,那么自动提交自然会自动关闭。以显示的事务声明优先。