MySQL-day4_02(事务)
事务
- 一、为什么要有事务
- 二、什么是事务
- 三、事务命令
一、为什么要有事务
- 事务广泛运用于订单系统、银行系统等多种场景。
例如:A用户和B用户是银行的储户,现在 A 要给 B 转账 500元,那么需要做以下几件事:
- 检查 A 的账户余额>500元;
- A 账户中扣除 500 元;
- B 账户中增加 500 元。
正常流程走下来,A 账户扣了 500,B 账户加了 500,皆大欢喜。那如果 A 账户扣了钱之后,系统出故障了呢?A 白白损失了 500,而 B 也没有收到本该属于他的 500。
以上的案例中,隐藏着一个前提条件:A 扣钱和 B 加钱,要么同时成功,要么同时失败,事务的需求就在于此。
二、什么是事务
- 所谓事务,是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
- 例如:银行转账工作,从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。
- 事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
三、事务命令
■ 开启事务
begin;
开启事务后执行修改 UPDATE 或删除 DELETE 记录语句,变更会写到缓存中,而不会立刻生效。
■ 回滚事务
rollback;
放弃修改。
■ 提交事务
commit;
将修改的数据写入实际的表中。
例 1:开启事务,删除 students 表中 studentNo 为 001 的记录,同时删除 scores 表中 studentNo 为 001 的记录,回滚事务,两个表的删除同时放弃。
begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
rollback;
开启事务:
删除 students 表中 studentNo 为 001 的记录:
删除 scores 表中 studentNo 为 001 的记录:
回滚事务:
▲ 回滚操作的案例:
例 2:开启事务,删除 students 表中 studentNo 为 001 的记录,同时删除 scores 表中 studentNo 为 001 的记录,提交事务,使两个表的删除同时生效。
begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
-- 一旦提交事务,两个删除操作同时生效
commit;
▲ 没有写 begin 代表没有事务,没有事务的表操作都是实时生效。
▲ 如果只写了 begin,没有 rollback,也没有 commit,结果是 rollback。