一、什么是事务

        事务 transaction 是一个抽象的概念,其实就是一组操作集合。mysql 不是所有存储引擎都支持事务,只有 InnoDB 和 NDB 支持(下文忽略)。

  • 自动提交

        InnoDB默认开启自动提交事务,我们可以通过下列语句查看:

SHOW VARIABLES LIKE 'autocommit';

  

mysql开启 binary logs Mysql开启事务默认自动提交_mysql

 

        自动提交的默认值为ON,就是说默认情况下,如果不显示声明开启事务,那么每次执行SQL语句都算一次事务,MYSQL帮我们自动提交了。比如下面2条语句,算2次事务:

UPDATE ... SET field=XXX WHERE ..
DELETE ... FROM ... WHERE ...

        我们可以通过下列语句显式开启事务:

-- 第一种:
START TRANSACTION

-- 第二种:WORK 可省略
BEGIN [WORK]

        两种语句的效果一致,只不过START TRANSACTION可以加限定条件,有兴趣的自行查下资料。开启显式事务后,在本次事务提交或者回滚前会暂时关闭自动提交的功能。

-- 回滚到事务开始前或回滚到事务保存点
ROLLBACK [WORK] TO [SAVAPOINT]

-- 提交事务
COMMIT;

隐式提交,即某些语句会导致之前的事务悄悄提交掉,就像输入了COMMIT语句一样,这显然不是我们希望的。大家可以查下资料,网上有很多。
 

二、事务的特性

我们希望事务具有下列特性:

  • 原子性(Acid):要么都成功,要么都失败,并且失败后要回滚到原始状态。
  • 隔离性(Isoland):多个事务之间的状态转换互不影响。
  • 一致性(Consistency):指的是数据库中的数据符合现实世界的约束规则,比如现实世界中,人的体重不可能为负数,假设数据库中体重的字段为weight,那么如果weight>0,那么我们可以说这个数据是符合一致性的,数据库能为我们解决一部分一致性,比如UNIQUE,可以帮我们做唯一性限制,但是更多情况下一致性规则由程序员控制。
  • 持久性(Durability):指事务执行成功后,结果永久保留。

三、事务的状态

根据事务执行的不同阶段,可以大致划分为下列几种状态

mysql开启 binary logs Mysql开启事务默认自动提交_数据库_02

  • 活动的 active :事务正在执行中时。
  • 预提交的 precommit:事务二阶段提交的第一阶段时,此时事务未真正执行成功。
  • 提交的 commit:事务提交成功,刷新到磁盘后。 
  • 失败的 fail:事务因错误或手动停止。
  • 中止的 abort:事务回滚后。