事务 transaction 是一个抽象的概念,其实就是一组操作集合。mysql 不是所有存储引擎都支持事务,只有 InnoDB 和 NDB 支持(下文忽略)。
InnoDB默认开启自动提交事务,我们可以通过下列语句查看:
SHOW VARIABLES LIKE 'autocommit';
自动提交的默认值为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语句一样,这显然不是我们希望的。大家可以查下资料,网上有很多。
我们希望事务具有下列特性:
根据事务执行的不同阶段,可以大致划分为下列几种状态