MySQL事务
MyISAM不支持事务(每一个SQL自动就提交了,不能做转账这种多条SQL组成的业务啊)!
InnoDB支持事务,支持行锁 !(InnoDB最大的2个特点)
事务的概念
有的业务需要1条以上的SQL语句共同完成,只有这些SQL都成功了才算业务成功了。
类似于银行的转账,商品的入库出库的场景:
转账业务由2条SQL组成。 没有一部分成功一部分失败这一说。
begin开启事务,如果这2句SQL都成功了,那么commit提交一个事务。
事务的三个状态:
- 开启事务(begin):所有sql语句执行成功了;
- 提交事务(commit):提交事务,表示事务生效了;
- 回滚事务(rollback):数据恢复到事务开始前的状态。
- 图中的
…
是捕捉任何类型的异常。 - 如果其中任意一句SQL由于突然停电,或者系统出错,执行出错了,那么事务就没有提交,事务就回滚,回滚就是数据恢复到事务开始前的状态。
这是存储引擎来保证的(redo log 和undo log保证的)。
mysql的默认引擎是innoDB;
- 默认是自动提交。
- 改成 0 ,手动提交事务,在代码上进行控制,做业务,业务都成功,提交1个事务,如果业务中间出现失败,就回滚1个事务
所以记住事务的几个基本概念,如下: - 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。
- 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
- 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态(事务开始前的状态)