目录
事务
事务是将一组SQL语句打包成一个整体,在这组SQL的执行过程中,要么全部成功,要么全部失败。这组SQL语句可以是一条也可以是多条。
如果转账成功,应该满足以下要求:
张三的账户余额减少100,变成900;李四的账户余额增加了100,变成1100。不允许出现张三的余额减少而李四的余额没有增加的情况。(原子性)
转账前张三和李四的总余额不变,即转账前他们的余额总数为2000,转账后他们的余额总数也应为2000。(一致性)
转账后的余额结果应当保存到存储介质中,以便日后查询和确认。(持久性)
在转账过程中,张三和李四的余额不能因为其他转账事件而受到干扰。(隔离性)
如何使用
在MySQL中,只有InnoDB引擎支持事务。通过下面的一些语句可以完成对事务的控制。
START TRANSACTION 或 BEGIN:开始一个新的事务。
COMMIT:提交当前事务,并将更改持久化保存到数据库中。
ROLLBACK:回滚当前事务,取消其所有更改,将数据库恢复到事务开始前的状态。
SET autocommit:禁用或启用当前会话的默认自动提交模式。autocommit 是一个系统变量,可以通过选项指定或者通过命令行设置 --autocommit={OFF|ON}。
默认情况下,MySQL启用事务的自动提交模式。这意味着每个单独的SQL语句都被视为一个独立的事务,并且在语句执行完成后会自动提交事务,就好像被 START TRANSACTION 和 COMMIT 包裹一样。因此,不能使用 ROLLBACK 来撤销单个语句的执行结果。如果在语句执行期间发生错误,MySQL会自动回滚当前语句所引起的任何更改。
ACID
ACID(原子性、一致性、隔离性、持久性)模型是数据库设计的重要原则,旨在确保事务处理的可靠性和数据完整性。MySQL的InnoDB存储引擎严格遵循ACID模型。
原子性(Atomicity)
事务中的所有操作要么全部完成并提交,要么全部取消(回滚)。在MySQL中,使用 COMMIT 提交事务或 ROLLBACK 回滚事务来保证原子性。
原子性实现原理
实现回滚的依据就是靠 uodo 日志来完成的。http://t.csdnimg.cn/s7E9X 具体看uodo日志部分。
持久性(Durability)
在提交事务时,MySQL会将数据持久化到存储介质,比如磁盘。通常情况下这一过程是可靠的,但在服务器崩溃或突然断电的情况下,可能会发生事务只部分写入数据文件的情况,导致数据不完整,从而破坏数据的一致性。
持久性实现原理
具体查看Redo日志部分http://t.csdnimg.cn/O5ImZ
为了解决这个问题,MySQL采用了以下几种机制来确保事务的持久化和数据的一致性:
重做日志(Redo Log):在真正将数据写入数据文件之前,MySQL会将事务中的所有数据修改操作记录到重做日志中。这些日志记录允许在服务器重启后重新执行尚未完成的事务操作,从而确保所有必须持久化的数据都能被写入存储介质中。
双写缓冲区(Doublewrite Buffer):MySQL还使用双写缓冲区来避免因写入过程中崩溃而导致的数据文件损坏。它首先将数据写入双写缓冲区,然后再将数据写入实际的数据文件。这种方式可以保证即使在写入过程中出现故障,数据文件也不会受到破坏。
二进制日志(Binary Log):除了重做日志,MySQL还使用二进制日志来记录数据库的所有修改操作。这些日志不仅用于恢复操作,还可以用于数据库复制和恢复等操作。
隔离性
MySQL服务可以同时被多个客户端访问,每个客户端执行的 DML 语句以事务为基本单位。当不同的客户端对同一张表中的同一条数据进行修改时,可能会出现相互影响的情况。为了保证不同的事务在执行过程中不受影响,事务之间需要相互隔离,这种特性就是隔离性。