事务:事务(transaction)是一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功。如果其中一个操作失败,则事务失败。如果事务成功,则事务提交,事务中各操作有效。如果事务失败,则事务回滚,该事务所有操作都无效。
例:
- 小明给小花 汇款 5000元 买 IPHONE,涉及到两条语句的执行:
update 存款表 set money = money - 5000 where 账户='小明';
update 存款表 set money = money + 5000 where 账户='小花';
- 当第一条语句执行成功,突然出现状况,就会造成数据的“不一致”。
- 要解决这类问题,就是“事务”的功能:
事务就是用来保证多条“增删改”语句的执行的“一致性”:要么都执行完成,要么都没有执行;
事务的特点:
类型 | 含义 |
---|---|
原子性 | 一个事务中的所有语句,应该做到:要么全做,要么一个都不做 |
一致性 | 让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1 |
隔离性 | 如果多个事务同时并发执行,但每个事务就像各自独立执行一样 |
持久性 | 一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化) |
事务模式:
- 在我们的cmd命令行模式中,是否开启了“一条语句就是一个事务”的这个开关:
默认情况下(安装后),这个模式是开启的,称为“自动提交模式”;
set autocommit = 1;
- 这样之后,每条增删改语句,都会立即生效;
我们可以把它关闭,那就是“人为提交模式”——即需要人为提交;
set autocommit = 0;
- 这样之后,所有增删改语句,都必须使用commit之后,才能生效;
事务执行的基本流程
- 开启一个事务:
start transaction; //也可以写成:begin;
- 2,执行多条增删改语句; //也就是相当于希望这多条语句要作为一个“不可分割”的整体去执行的任务
- 3,判断这些语句执行的结果情况,并进行提交或回滚:
if( 没有出错 ){
commit; //提交事务;此时就是一次性完成;
}
else{
rollback; //回滚事务;此时就是全部撤销;
}
在php中: