MySQL—事务

概述

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命令显示的启动一个事务,那么自动提交自然会自动关闭。以显示的事务声明优先。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注