一个sql语句就是一个事务,事务可以保证一组sql语句要么都成功,要么都失败,默认自动提交,可以设置set autocommit=0
关闭自动提交。
1.场景举例
比如有两个数据库1和2,分别代表2个人的存款,当其中一个人转钱给另一个人时,步骤一般是数据库1中扣除金额A,数据库2中增加金额A。假如在扣除数据库1中金额后立刻断电了,那么数据库2中还没来得及加金额,这就造成数据出问题,所以这里就需要将这一组操作都添加到事务当中。即要么扣款和增款都完成,要么都失败,从而保证了数据不会出错。
2.DTL
事务控制语言
(1)基本格式
start transaction;
#事务开始
...
中间是执行语句
...
#rollback;
#在事务没结束前如果出错可以通过这句回滚
commit;
#如果事务正常结束,则最后通过这句提交,否则数据不会真正的更新
(2)事务失败例子
mysql> start transaction;
mysql> update food set number=number-10 where id=1;
mysql> update food set number=number-15 where id=2;
mysql> update food set number=number-10 where id=100;
#sql语句出错
mysql> rollback;
#回滚,会发现所有数据都回到第一句之前的样子
(3)事务成功例子
mysql> start transaction;
mysql> update food set number=number-10 where id=1;
mysql> update food set number=number-15 where id=2;
mysql> commit;
#成功提交,数据修改完成,此时会发现数据已经真的更新了
(4)满足特性
(1)原子性:一个事务中的语句要么全做,要么全不做
(2)一致性:数据库的数据更改应该合理,即对应上面的转账例子(总钱数应该不变)
(3)隔离性:如果多个事务并发执行,但每个就像独立执行一样
(4)持久性:数据执行成功应该是明确的硬盘数据更改,而不仅是内存中的变化(通过commit提交实现)