MySQL的事务

188 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言: 本篇文章是我关于MySQL的第五篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。上一篇简单介绍了MySQL中关于颗粒度控制,锁策略等。本篇文章来介绍一下事务。😑

一. 事务

1. 事务是什么

事务是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能成功执行这一组命令,那么它的结果就会被写入数据库中。如果其中有一条失败了,刚才执行的所有结果都不会写入数据库中。从结果来看,事务内的语句,要么全部成功,要么全部失败。 可能有些初学者朋友看到会感觉有点绕。一般别的文章都是拿转账来举例的,这里我拿之前一款通关游戏来举例。游戏的通关要求是要去分别救5个NPC,如果有一个NPC在救援过程中死亡,则游戏失败。

游戏的关卡就像上文的事务,单独救援1个NPC就像事务中一条SQL,救援一个NPC失败则意味着游戏失败(事务失败回滚),所有的NPC的状态又变为被困。只有所有的NPC都救援成功(SQL都执行成功),这一关(事务)才算成功,可以去下一关(数据被写入到数据库中)。

2. 怎么开启事务

start transaction; -- 开启事务
update table_name set table_status='error' where id=1;
update table_name set table_status='error' where id=2;
commit; -- 提交事务

3. 事务的四个属性。

  • 原子性:一个事务必须为不可分割的最小单位,要么全部成功,要么全部失败。对于一个事务来说,不能只执行其中部分sql,这就是事务的原子性。
  • 一致性:数据库总是从一个一致性的状态转换为另一个一致性的状态,就像上文中说的一样,如果只有一个NPC救援失败了,所有的NPC的状态都会回归被困的原始状态。
  • 隔离性:通常来说,事务在执行完成之前对其他线程是不可见的。
  • 持久性:一旦事务提交,所有的数据就会写入到数据库中,就算后续数据库崩溃了,修改完成的数据也不会消失。