事务的定义
事务是一组可以提交或者撤销的操作的集合,可以把它看做是一个不可分割的操作集合。
在一个事务中,所有的操作要么全部提交成功,要么全部都会被撤销,因此,这可以保证数据的一致性及完整性。MySQL 提供了非常完善的事务机制支持,这对于数据库用户来说是非常重要的。
事务的四个属性
事务有四个重要的属性,这些属性被称为 ACID
原子性(Atomicity)
事务被看做是不可分割的工作单元,其中每个操作要么全部完成,要么全部失败。也就是说,事务所有的操作都要么全部执行,要么全部都不执行,不会有中间状态。
一致性(Consistency)
事务在执行之前和之后,都处于一致的状态。在执行事务之前,数据库中的状态符合一定的约束,需要保证事务的执行和提交后数据库的状态也符合约束。因为事务不仅是对数据的修改,还可能涉及到其他系统资源的修改。
隔离性(Isolation)
事务的隔离性指的是事务之间的相互隔离。在一个事务还没有提交修改时,其他事务不能访问它所修改的数据,而且不能修改它锁定的数据。同时,其它事务所做的修改在本事务中是无法看到的。该属性保证了修改的隔离性。
持久性(Durability)
持久性指的是一旦事务提交成功,它所做的修改就会被永久保存到数据库中,并且不能因为系统故障而被回滚。如果事务的修改已经成功提交,那么数据就是永久性的。
MySQL 中的事务处理
InnoDB的事务处理
在 MySQL 中,不是所有表的类型都支持事务,使用事务的表必须使用类型为 InnoDB 的表。 InnoDB 是 MySQL 的一个事务安全的存储引擎。
使用 InnoDB 存储引擎,必须满足以下条件:
必须首先用 CREATE TABLE 创建一个 InnoDB 表,InnoDB 表是具有事务处理的一种表类型。
必须开启事务,使用 START TRANSACTION 语句。
事务结束后,必须使用 COMMIT 或 ROLLBACK 语句,对事务做出处理。
InnoDB的锁机制
InnoDB 的锁是自动添加和释放的,无需用户干预。 锁级别有以下几个:
共享锁(Shared Lock):多个事务可以同时读取,但是不能并发读取。
排他锁(Exclusive Lock):事务在执行期间,其他事务不能读取数据,同时也不能对数据加排他锁。
事务的操作
开启事务
开启事务需要使用 START TRANSACTION 语句。
START TRANSACTION;
提交事务
事务的提交需要使用 COMMIT 语句,执行这个命令后,系统就会对数据库进行更改并且释放锁定的表。
COMMIT;
回滚事务
当某个事务处理失败或者出现系统错误时,就可以使用 ROLLBACK 并撤销对数据库的任何更改。
ROLLBACK;
回滚到某个指定的点
可能需要回滚到一个指定的时间点,或者是执行了某个操作。回滚到指定的点需要使用 ROLLBACK TO 语句。
ROLLBACK TO savepoint_1;
这里的 savepoint_1 是我们设定的一个保存点。
保存点
在事务中,如果需要回滚到中间的某个状态,可以使用保存点进行记录。创建保存点的语句如下:
SAVEPOINT savepoint_1;
这里的 savepoint_1 就是我们创建的保存点名字,可以根据需求来更改。
总结
MySQL 提供了非常完善的事务机制支持,它不仅可以将多个 SQL 语句看做一个整体进行处理,还能确保 SQL 语句的原子性、一致性、隔离性和持久性,使用事务可以保证数据的完整性和可靠性。