高性能MySQL:03---事务介绍(START TRANSACTION、COMMIT、ROLLBACK、ACID性质)

坚强是说给别人听的谎言 提交于 2019-12-16 08:16:12

一、事务介绍

  • 事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如 果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执 行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行, 那么所有的语句都不会执行
  • 也就是说,事务内的语句,要么全部执行成功,要么全部执行失败

二、事务的演示案例

  • 银行应用是解释事务必要性的一个经典例子。假设一个银行的数据库有两张表:支票(checking)表和储蓄(savings)表。现在要从用 户Jane的支票账户转移200美元到她的储蓄账户,那么需要至少三个步骤:
    • 1. 检查支票账户的余额高于200美元
    • 2. 从支票账户余额中减去200美元
    • 3. 在储蓄账户余额中增加200美元
  • 上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败, 则必须回滚所有的步骤

三、事务的命令实现

  • 可以用START TRANSACTION语句开始一个事务,然后要么使用COMMIT提交事务将修改的数据持久保留,要么使用ROLLBACK撤销所有的修改
  • 以“二”中的演示案例为例,其事务的SQL样本如下:
START TRANSACTION;

SELECT balance FROM checking WHERE customer_id = 10233276;
UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;

COMMIT;
  • 单纯的事务概念并不是故事的全部。试想一下,如果执行到第四条 语句时服务器崩溃了,会发生什么?天知道,用户可能会损失200美 元。再假如,在执行到第三条语句和第四条语句之间时,另外一个进程 要删除支票账户的所有余额,那么结果可能就是银行在不知道这个逻辑 的情况下白白给了Jane 200美元。下面介绍事务的ACID性质

四、事务的ACID性质

  • 除非系统通过严格的ACID测试,否则空谈事务的概念是不够的。 ACID表示原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)。一个运行良好的事务处理系统, 必须具备这些标准特征
  • 就像锁粒度的升级会增加系统开销一样,这种事务处理过程中额外的安全性,也会需要数据库系统做更多的额外工作。一个实现了ACID的数据库,相比没有实现ACID的数据库,通常会需要更强的CPU处理能力、更大的内存和更多的磁盘空间

原子性(atomicity)

  • 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事 务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)

  • 数据库总是从一个一致性的状态转换到另外一个一致性的状态
  • 在前面的例子中,一致性确保了,即使在执行第三、四条语句 之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终 没有提交,所以事务中所做的修改也不会保存到数据库中

隔离性(isolation)

  • 通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的
  • 在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外一个账户汇总程序开始运行,则其看到的支票账户的余额并没有被减去200美元。后面我们讨论隔离级别 (Isolation level)的时候,会发现为什么我们要说“通常来说”是不 可见的

持久性(durability)

  • 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失
  • 持久性是个有点模糊的 概念,因为实际上持久性也分很多不同的级别
  • 有些持久性策略能 够提供非常强的安全保障,而有些则未必。而且不可能有能做到 100%的持久性保证的策略(如果数据库本身就能做到真正的持久 性,那么备份又怎么能增加持久性呢?)。在后面的一些文章中, 我们会继续讨论MySQL中持久性的真正含义

五、事务总结

  • 用户可以根据业务是否需要事务处理,来选择合适的存储引擎。对于一些不需要事务的查询类应用,选择一个非事务型的存储引擎,可以获得更高的性能。即使存储引擎不支持事务,也可以通过LOCK TABLES语句为应用提供一定程度的保护,这些选择用户都可以自主决定
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!