文章目录
在开发过程中,我们经常为了完成某一功能而编写一组SQL语句。为了确保每一组SQL语句操作数据的完整性,MySQL引入了事务的管理。事务处理机制可以保证在同一个事务中的操作具有同步性,从而让整个应用程序更加安全。
一、事务概述
在MySQL中,事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成。在程序执行过程中,只要有一条SQL语句执行失败或发生错误,其他语句都不会执行;也就是说,事务中的语句要么都执行,要么都不执行。
数据库之所以提供事务的机制,主要有以下两个目的:
- 为数据库的一组操作提供了一个从失败中恢复到正常状态的途径,同时保证了数据库即使在异常状态下也仍能保持数据的一致性。
- 当多个应用程序并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
MySQL中的事务必须满足四个特性,即事务的ACID特性,分别是原子性、一致性、隔离性和持久性。
- 原子性(Atomictity)
原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功。事务中的所有DML操作,要么全部执行成功,要么全部执行失败,不会存在部分执行成功,部分执行失败的情况。事务中如果有任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态,相当于事务没有执行过。 - 一致性(Consistency)
一致性是指事务在开始执行前和事务执行结束后,数据库中数据的完整性没有被破坏。数据从一个一致状态转变为另一个一致状态,并且完全符合所有的预设规则,数据不会存在一个中间的状态。 - 隔离性(Isolation)
隔离性是指一个事务在执行时,不会受到其他事务的影响。隔离性保证了未完成事务的所有操作与数据库系统的隔离,直到事务完成之后,才能看到事务的执行结果。当多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 - 持久性(Durability)
持久性是指事务一旦提交,对数据库中数据的修改就是永久性的。数据不会因为系统出现故障而丢失。为了实现事务的持久性,MySQL在提交事务时采用的是预写日志的方式。即提交事务时,先写日志,再写数据。只要日志成功写入,就是事务提交成功。
事务的持久性不能做到百分之百的持久,只能从事务本身的角度来保证永久性,如果一些外部原因导致数据库发生故障(如硬盘损坏),那么所有提交的数据可能都会丢失。
二、事务基本操作
在MySQL中,用户执行的每一条SQL语句默认都会当成单独的事务自动提交。如果想要将一组SQL语句作为一个事务,