说明
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 INSERT、UPDATE、DELETE 语句
条件
原子性
Atomicity:每个事务(Transaction)都看作最小逻辑操作,不可进行分割;执行错误,会被回滚(Rollback)到事务开始前
一致性
Consistency:在事务开始之前和事务结束以后,数据库的完整性没有被破坏
隔离性
Isolation:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离
读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失;通过“排他写锁”实现
- 读提交(Read Committed):不可重复读取,但不允许脏读取;通过“瞬间共享读锁”和“排他写锁”实现
- 可重复读(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据;通过“共享读锁”和“排他写锁”实现
- 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行
持久性
Durability:当事务执行完毕(事务提交),该操作将永久的改变了数据库中的数据语句
BEGIN 或 START TRANSACTION 显式地开启一个事务;
COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier 把事务回滚到标记点;
SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
方法
手动提交
用 BEGIN、ROLLBACK、COMMIT 来实现#开始一个事务
BEGIN
#事务回滚
ROLLBACK
#事务确认
COMMIT
自动提交
直接用 SET 来改变 MySQL 的自动提交模式禁止自动提交
SET AUTOCOMMIT=0
开启自动提交
SET AUTOCOMMIT=1